本文是《Effective Java》1書的整理筆記
設計良好的模塊會隱藏所有的實現細節,把它的API與它的實現清晰地隔離開來。然后,模塊之間只通過它們的API進行通訊,1個模塊不需要知道其他模塊的內部工作情況,這1概念被稱為信息隱藏(information hiding)或封裝(encapsulation)
它可以有效地消除組成系統各模塊之間的耦合關系,使得這些模塊可以獨立的開發、測試、優化、使用、理解和修改。這樣可以加快系統開發的速度,由于可以并行開發。
減輕保護的負擔,由于程序員可以更快的理解這些模塊,并在調試的時候可以不影響其他模塊的負擔。
雖然信息隱藏不會帶來更好的性能,但可以有效的調理性能:通過剖析肯定了那些模塊影響了性能。
提高了軟件的可重用性
下降了構建大型系統的風險,由于即便全部系統不可用,但這些獨立的模塊卻有多是可用的。
成員變量不能是公然的,常量是例外。
可使用
public static final
來修飾常量
另外常量要末包括基本類型,要末指向不可變對象的援用。雖然援用不能被修改,但援用的對象卻是可以被修改的。
長度為非0的數組總是可變的,因此用public static final
修飾的數組容易帶來潛伏的安全漏洞。
有兩種解決方式,1是將數組變成私有,并添加1個公有的不可變列表
private static final Thing[] PRIVATE_VALUES = {};
public static final List<Thing> VALUES=
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
2是使數組變成私有的,并添加1個公有方法,返回數組的備份。
private static final Thing[] PRIVATE_VALUES = {};
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
使用setter和getter方法訪問類成員變量,有以下好處
* 可以添加束縛條件
* 可以靈活的修改該類的內部表示方式
不可變類的每一個實例包括的所有信息都必須在創建該實例的時候就提供,>并在對象的全部生命周期內固定不變。
final
的
如果類中有指向可變對象的變量,要確保不會被該類的客戶端取得指向這些對象的援用。在構造器、訪問方法和readObject
方法中使用保護性拷貝。
不可變對象本質上是線程安全的,它們不要求同步。
可以提供1個靜態工廠將該類經常使用的實例緩存起來,基本包裝類和
BigInteger
都有這樣的靜態工廠。
不要用為不可變對象提供clone
方法或拷貝構造器
不可變類的缺點是對不同的值都需要1個單獨的對象。
可以提供1個配套的公有的可變配套類,避免在大范圍操作時釀成的性能消耗,例如
String
和StringBuilder
聲明構造器為private
可以避免該類被繼承。
final
域,當它們第1次被要求計算時,把1些開消昂貴的結果緩存到這些域中,以便下次再次要求一樣的計算,就直接返回這些緩存的值。Serializable
接口,就必須顯示的提供1個readObject
或readResolve
方法,或使用ObjectOutputStream.writeUnshared
和ObjectInputStream.readUnshared
方法。《Java編程思想》稱為組合,《Effective Java》稱為復合
這里所說的缺點不包括,接口繼承和完全為繼承而設計的超類
可覆蓋的方法是指非
final
的,public
或protected
的方法
也就是說必須精確的描寫覆蓋每一個方法所帶來的影響。
對可覆蓋的方法或非private
構造器,必須指明它調用了那些可覆蓋的方法,是以甚么順序調用的,每一個調用結果又是如何影響后續的處理進程。那些情況下它會調用可覆蓋的方法
Cloneable
或Serializable
接口,不管clone
還是readObject
都不可以調用可覆蓋的方法,不管是間接還是直接。Serializable
,并且該來有readResolve
或writeReplace
方法,就必須使其成為protected
,避免子類疏忽這兩個方法。mixin是指這樣的類型,類除實現它的“基本類型”以外,還可以實現這個mixin類型,以表明它提供了某些可供選擇的行動。
接口之所以被稱為mixin,是由于它允許任選的功能可被混合到類型的主要功能中。
AbstractCollection
類Adapter
,它允許外部類的實例被看做另外一個不相干的類的實例。例如Map
接口中的集合視圖。static
。Comparator
實例。Runnable
、Thread
。歡迎大家訪問我的博客,轉載請注明出處
http://blog.csdn.net/abyss521