分享一下馬劍威老師在編程中注意的兩小點(diǎn),很有用的哦

今天講兩點(diǎn)小點(diǎn),說(shuō)是小點(diǎn)是真的是小點(diǎn),可能大家平常開發(fā)中覺得無(wú)關(guān)緊要的,今天在這里給大家稍微提醒一下。

第一點(diǎn)、將局部變量的作用域最小化。

過(guò)早地聲明局部變量不僅會(huì)使它的作用域過(guò)早地?cái)U(kuò)展,而且結(jié)束得也過(guò)于晚了。局部變量的作用域從它被聲明的點(diǎn)開始擴(kuò)展,一直到外層的塊結(jié)束點(diǎn),也就是結(jié)束得大括號(hào)位置。如果變量是在使用它的塊之外被聲明,也就是在括號(hào)外面聲明,那么程序塊執(zhí)行完成之后,這個(gè)變量仍是存在的,也就是說(shuō)它的存在超出了他真正的使用區(qū)間。那么,如果說(shuō)這個(gè)變量在他的使用區(qū)間之前或者之后被以外的使用的話,造成的錯(cuò)誤就讓人很無(wú)語(yǔ)了。

其次就是變量的存在占用的內(nèi)存空間,猶記得當(dāng)初我學(xué)Android的時(shí)候,那時(shí)候還早,威哥還告訴我們要竭盡所能的節(jié)省程序運(yùn)行內(nèi)存,優(yōu)化程序,減少不必要的空間占用,提升用戶體驗(yàn)。雖然現(xiàn)在手機(jī)的運(yùn)行內(nèi)存都慢慢在增大,但是代碼的性能優(yōu)化,提升用戶體驗(yàn)這個(gè)是作為一個(gè)程序員必備的功課。

要使局部變量的作用域最小化

一、在第一次使用它的地方聲明。如果變量在使用之前進(jìn)行聲明,這樣可能一方面加大了代碼的可讀性,就是如果聲明早了,你或者別的開發(fā)者閱讀起來(lái),看著這個(gè)上不著村下不著店的變量名,哎他是什么意思,用到哪里了;另一方面可能就在使用的時(shí)候忘了這個(gè)變量的初始值是多少了,有沒(méi)有初始化什么的,通常很多新手都因?yàn)檫@些因素造成空指針問(wèn)題。

二、先聲明,不進(jìn)行初始化。如果你還沒(méi)有足夠的信息來(lái)對(duì)一個(gè)變量進(jìn)行有意義的初始化,就應(yīng)該推遲這個(gè)聲明,直到可以初始化為止。

當(dāng)然有人說(shuō)在try-catch語(yǔ)句塊中,如果這個(gè)代碼語(yǔ)句可能會(huì)發(fā)生部分異常,而且咱們又要求try塊中的代碼盡量少,那么可能其中有變量會(huì)在后邊使用到,那么就必須在try塊之前被聲明,但是我們這里就不給他有意義的初始化了。這里有意義的初始化,就是初始值直接給默認(rèn)的值即可。

最后一種將局部變量的作用域最小化的方法時(shí)是方法小而集中。如果把兩個(gè)操作合并到同一個(gè)方法中,與其中一個(gè)操作相關(guān)的局部變量就有可能會(huì)出現(xiàn)在執(zhí)行另一個(gè)操作的代碼范圍之內(nèi)。為了防止這種情況發(fā)生,只要把這個(gè)方法分成兩個(gè),每個(gè)方法各執(zhí)行一個(gè)操作。

第二點(diǎn):for-each循環(huán)優(yōu)先于傳統(tǒng)的for循環(huán)

像遍歷集合的for循環(huán)里,咱們目前首選for-each

for(Element e:c){

doSomething(e);

}

在Java1.5發(fā)行版本之前,首選的做法如下:

for(Iterator i = c.iterator() ; i.hasNext();){

doSomething(i.next());

}

咱們?cè)谶@里面引用for-each循環(huán),在簡(jiǎn)潔性和預(yù)防Bug方面有著傳統(tǒng)的for循環(huán)無(wú)法比擬的有事,并且沒(méi)有性能損失。

1、當(dāng)見到冒號(hào)時(shí),可以把它讀作在...里面。比起普通的for循環(huán),他還稍有些性能優(yōu)勢(shì),因?yàn)樗麑?duì)數(shù)組索引的邊界值只計(jì)算一次。

2、for-each還可以解決一些嵌套循環(huán)中的Bug,比如下面一段代碼:

enum Person{ ONE,TWO,THREE,FOUR,FIVE,SIX}

Collection person = Arrays.asList(Person.values());

for(Iterator p = person.iterator();p.hasNext()){

for(Iterator ps = person.iterator() ; ps.hasNext()){

System.out.println(i.next()+” ”+j.next());

}

}

這個(gè)程序不會(huì)拋出異常,但是只會(huì)打印出6個(gè)重復(fù)的詞(從“ONE ONE”到“SIX SIX”),而不是預(yù)計(jì)的36種組合。如果使用的是嵌套的for-each循環(huán),這個(gè)問(wèn)題就會(huì)消失,而且代碼還相對(duì)的簡(jiǎn)潔。

遺憾的是,有三種常見的情況無(wú)法使用for-each循環(huán):

1、如果需要遍歷集合,并刪除選定的元素,就需要使用顯示的迭代器,以便可以使用它的remove方法

2、如果需要遍歷列表或者數(shù)組,并取代他部分或者全部的元素值,就需要列表迭代器或者數(shù)組索引,以便設(shè)定元素的值

3、如果需要并行的遍歷多個(gè)集合,就需要顯示的控制迭代器或者索引變量,以便所有迭代器或者索引變量都可以得到同步前移。

這里參考自Effective Java,加上一些個(gè)人理解。大家有興趣可以去看一下這本書,里面都是講解的一些開發(fā)中需要注意的小細(xì)節(jié)問(wèn)題,值得一看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,734評(píng)論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評(píng)論 19 139
  • 01 · 坐在咖啡館的一角,服務(wù)員提醒她咖啡要趁熱喝,清點(diǎn)了點(diǎn)頭,微笑~……然后繼續(xù)發(fā)呆——她是覺得要喝溫的,涼一...
    敏感人群閱讀 410評(píng)論 0 0
  • 1.常見形式 2. 屬性特性 數(shù)據(jù)屬性有4個(gè)特性:value,writable,enumerable,confi...
    last_edc閱讀 1,166評(píng)論 0 0

友情鏈接更多精彩內(nèi)容