《Effective Java 2nd》第4章 類和接口

目錄

第4章 類和接口

第13條: 使類和成員的可訪問性最小化

儘量使每一個類或者成員不被外界訪問。提供儘量小的訪問級別。數組

final維持字段不可變性,字段要麼是基本類型的、要麼是指向不可變對象的引用。安全

若是final包含可變對象的引用,雖然引用不能被修改,可是引用對象的內部卻能夠被修改。app

注意:長度非0的數組老是可變的。框架

 

第14條:在公有類中使用訪問方法而非公有域

 

第15條:使可變性最小化

講了不可變類的相關內容。函數

不可變類:實例不能被修改的類。實例化後,實例中包含的內部信息在整個生命週期中固定不變。工具

如何使類不可變ui

1)不提供任何修改對象狀態的方法spa

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

 

局部類

在任何可聲明局部變量的地方,均可聲明局部類。

相關文章
相關標籤/搜索