《Effective Java 2nd》第4章 类和接口
第4章 類和接口
第13條: 使類和成員的可訪問性最小化
盡可能使每個類或者成員不被外界訪問。提供盡可能小的訪問級別。
final維持字段不可變性,字段要么是基本類型的、要么是指向不可變對象的引用。
如果final包含可變對象的引用,雖然引用不能被修改,但是引用對象的內部卻可以被修改。
注意:長度非0的數組總是可變的。
?
第14條:在公有類中使用訪問方法而非公有域
?
第15條:使可變性最小化
講了不可變類的相關內容。
不可變類:實例不能被修改的類。實例化后,實例中包含的內部信息在整個生命周期中固定不變。
如何使類不可變
1)不提供任何修改對象狀態的方法
2)保證類不會被擴展。如將類聲明為final
3)使所有的域都是final的
4)所有的域都是私有的
5)對任何可變域(指指向可變對象的域),使用保護性拷貝技術
不可變對象的好處:線程安全,可以自由共享
不可變類的唯一缺點:每個不同的值都要有一個單獨的對象,比如String s = ”aaa", String s2 = "bbb"。
因不可變類的缺點,可以提供一個可變配套類,比如對String來說有StringBuilder
?
第16條:復合優先于繼承
這里的繼承指的是一個類擴展另一個類的時候,不含接口繼承(類實現接口、接口實現接口)。
只有當兩個類A和B,兩者之間確實存在is a關系的時候,才適合用繼承。問自己:每個B都是A嗎?
?
第17條:要么為繼承而設計,并提供文檔說明,要么就禁止繼承
如果某個類是為繼承而設計的,在類文檔中應該明確描述覆蓋每個方法所帶來的影響。
?
第18條:接口優先于抽象類
接口和抽象類區別
1)抽象類允許包含某些方法的實現,接口不允許。
2)實現抽象類,類必須成為抽象類的子類。但是,任何一個類均可實現一個接口,不管這個類位于類繼承層次的哪個位置。
?
接口的好處:
1)現有類很容易通過實現新的接口,實現新的功能,不管這個類位于類繼承層次的哪個位置。
2)接口是定義mixin類型的理想原則。
mixin類型:指類除了實現它的基本功能外,還可以實現mixin類型,以表明它提供了某種可供選擇的功能。
舉例:Comparable是mixin接口,某個類實現后代表具備排序功能。
3)類允許我們構造非層次接口的類型框架。
舉例:singer接口代表歌唱家,songwriter接口代表作曲家,我們完全可以聲明一個SingerSongwriter接口擴展上面兩個接口,代表同時歌唱家也是作曲家。
?
接口不允許含方法的實現。但是可提供個抽象的骨架實現類。接口用于定義類型,但是骨架實現類用于接口接口實現相關工作。
舉例:集合框架中的AbstractCollection、AbstractSet等都是骨架實現類。
?
第19條:接口只用于定義類型
講了不要使用常量接口。常量接口類似于下面。
public interface XXXXContants {static final double XXXXXX = 1.1222;static final double YYYYYY = 1.3222; }常量接口的壞處:在版本迭代時,某個類不再使用這些常量了,仍必須實現這個接口,以確保二進制兼容性。
?
如何定義常量。
1)常量與某個類或接口緊密相關,定義在這個類后接口中。
舉例:Integer中的常量MIN_VALUE
2)使用枚舉類型
3)使用常量工具類。
?
第20條:類層次優于標簽類
?
?
第21條:用函數對象表示策略
Java中沒有函數指針,但是可以用對象引用實現同樣的功能,這樣的實例稱為函數對象,舉例:Comparator類定義了排序策略。
?
第22條:優先考慮靜態成員類
講了嵌套類,主要是各種內部類的使用場景。
嵌套類有4種:
1)內部類:靜態內部類、非靜態內部類、匿名內部類
2)局部類
?
靜態內部類
靜態內部類常見用法是用作輔助類。舉例:Calculator內部聲明一個靜態枚舉類Operation用于表示計算器支持的各種操作。Calculator.Operation.PLUS,Calculator.Operation.MINUS。
私有靜態內部類的常見用法是用來代表外部類所代表的對象的組件。舉例:Map的Entry。
?
非靜態內部類
非靜態內部類的常見用法是定義一個Adapter。舉例:Map接口使用非靜態內部類來實現集合視圖(collection view),如keySet、entrySet等。
?
靜態內部類和非靜態內部類的區別
1)靜態內部類可看做是普通的類,只是碰巧聲明在另一個類的內部。可以脫離外部類的實例獨立存在。
2)非靜態內部類的每個實例都與外部類的一個實例向關聯,當非靜態內部類被創建時,這種聯系建立起來。
?
匿名內部類
匿名內部類常見用法
1)創建函數對象。舉例:排序時,創建匿名Comparator實例,傳遞給sort方法。
2)創建過程對象。舉例:Runnable、Thread
?
局部類
在任何可聲明局部變量的地方,都可聲明局部類。
轉載于:https://www.cnblogs.com/yeyang/p/10461301.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的《Effective Java 2nd》第4章 类和接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019.03.02
- 下一篇: 如何用代码的方式取出SAP C4C销售订