今天講兩點(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)題,值得一看