我們接下來討論一下Java語言的細節,包括局部變量的處理,庫的使用,以及兩種不是語言本身提供的機制的使用等等一些大家平時可能忽略的問題。

Item 29:將局部變量的作用域最小化

和C語言要求局部變量必須被生命在代碼的開始處相比,Java程序設計語言寬松得多,它允許你在代碼的任何位置聲明。要想使一個局部變量的作用域最小化,最高小的技術是在第一次需要使用它的地方聲明,變量的作用域是從聲明它的地方開始到這個聲明做在的代碼塊的結束位止,如果我們把變量的聲明和代碼的使用位置分開的過大,那么對于讀這段代碼的人來說,是很不幸的。

我們幾乎都是在一個局部變量聲明的地方同時給它初始化,注意這是很重要的,甚至有時候,如果我們的初始化應該推遲到下一個代碼的位置,我們同時應該把聲明也往后延遲。這條規則唯一的例外是try-catch這個語句,因為如果一個變量被方法初始化,那么這個方法很有可能拋出一個異常,那我們最常用的方法就是把它置于try塊的內部去進行初始化。由此我們可以得出,for循環優于while循環,我們在能使用for循環的地方盡量使用for而不使用while,因為for循環是完全獨立的,所以重用循環變量名字不會有任何傷害。

最后我們要記住的是盡量把我們的函數寫的小而集中,這樣才能真正組做到”最小化局部變量的作用域”這一要旨。

Item 30:了解和使用庫

使用標準庫,我們可以充分利用編寫這些庫的Java專家的知識,以及在你之前其他人的使用經驗,這就是所謂站在巨人的肩膀上看世界吧~

在每一個Java平臺的發行版本里面,都會有許多新的包的加入,和這些更新保持一直是值得的,比如說我們J2ME的開發,在MIDP 1.0的時代,我們要寫個Game還要自己動手寫工具類,現在MIDP2.0推出之后,大多數寫游戲的人都覺得方便了很多,因為在這個版本里面加入了游戲包,為我們的開發節省了大量的人力物力。

     Item 31:如果想要知道精確的答案,就要避免使用double和float

     對于金融行業來說,對數據的嚴整性要求是很高的,不容半點馬虎,那大家都知道再我們的Java語言里面有兩個浮點數類型的變量float和double,可能大家會認為他們的精度對于金融行業這樣對數字敏感的行業來說,已經夠用了,但是在開發當中,我們要盡量少使用double和float,因為讓他們精確的表達0.1是不可能的。那我們如何解決這個問題呢,答案是使用BigDecimal,int或者long進行貨幣計算。在這里對大家的忠告是:對于商務運算,我們盡量使用BigDecimal,對于性能要求較高的地方,我們有能力自己處理十進制的小數點,數值不太大的時候,我們可以使用int或者long,根據自己的需要來判定具體使用哪一個,如果范圍超過了18位數,那我們必須使用BigDecimal。 

     Item 32:如果其他類型更適合,則盡量避免使用字符串

     在偶看到這條建議之前,我就很喜歡用字符串,不管在什么場合下,先String了再說,但是實際上很多情況下,我們要根據實際情況來判定到底使用什么類型,而且字符串不適合替代枚舉類型,類型安全枚舉類型和int值都比字符串更適合用來表示枚舉類型的常量。字符串也不適合替代聚集類型,有一個更好的方法就是簡單的寫一個類來描述這個數據集,通常是一個私有的靜態成員類最好。字符串也不適合代替能力表,總而言之,如果可以適合更加適合的數據類型,或者可以編寫更加適當的數據類型,那么應該避免使用字符串來表示對象。 

Item 33:了解字符串的連接功能

我們經常在使用System.out.println()的時候,往括號里寫一串用“+”連接起來的字符串,這是我們最常見的,但是這個方法并不適合規模較大的情形,為連接N個字符串而重復地使用字符串連接操作符,要求N的平方級的時間,這是因為字符串是非可變的,這就導致了在字符串進行連接的時候,前后兩者都要拷貝,這個時候我們就提倡使用StingBuffer替代String。 

Item 34:通過接口引用對象

通俗的說就是盡量優先使用接口而不是類來引用對象,如果有合適的接口存在那么對使用參數,返回值,變量域都應該使用接口類型養成使用接口作為對象的習慣,會使程序變得更加靈活。

如果沒有合適的接口,那么,用類而不是接口來引用一個對象,是完全合適的。

Item 35:接口優先于映像機制

java.lang.relect提供了“通過程序來訪問關于已裝載的類的信息”,由此,我們可以通過一個給定的Class實例,獲得Constructor,Method和Field實例。

映像機制允許一個類使用另一個類,即使當前編譯的時候后者還不存在,但是這種能力也要付出代價:

我們損失了了編譯時類型檢查的好處,而且要求執行映像訪問的代碼非常笨拙和冗長,并且在性能上大大損失。

通常,普通應用在運行時刻不應以映像方式訪問對象。

Item 36:謹慎的使用本地方法

JNI允許Java應用程序調用本地方法,所謂本地方法是指用本地程序設計語言(如C,C++)來編寫的特殊方法,本地方法可以在本地語言執行任何計算任務,然后返回到Java程序設計語言中。但是隨著JDK1.3及后續版本的推出這種通過使用本地方法來提高性能的方法已不值得提倡,因為現在的JVM越來越快了,而且使用本地方法有一些嚴重的缺點,比如使Java原本引以為傲的安全性蕩然無存,總之在使用本地方法的時候要三思。

Item 37:謹慎使用優化

不要因為性能而犧牲合理的代碼結構,努力編寫好的程序而不是快的程序,但是避免那些限制性能的設計決定,同時考慮自己設計的API決定的性能后果,為了獲得更好的性能而對API進行修改這也是一個非常不好的想法,通常我們在做優化之后,都應該對優化的程度進行一些測量。

Item 38:遵守普遍接受的命名慣例

Java有一套比較完善的命名慣例機制,大部分包含在《The Java Language Specification》,嚴格得講這些慣例分成兩類,字面的和語法的。

字面涉及包,類,接口,方法和域,語法的命名慣例比較靈活,所以爭議更大,字面慣例是非常直接和明確的,而語法慣例則相對復雜,也很松散。但是有一個公認的做法是:“如果長期養成的習慣用法與此不同的話,請不要盲目遵從.