1背景
看SM之前給我重構的kafka消費者的代碼,kafka消費者的初始化、訂閱主題、消息拉取聚合到一個靜態內部類當中,外部類的中的單例和消息map再以實例的方式注入到靜態內部類當中,代碼結構大致如下:
class KafkaService {
//單例
public static SingltonHoler{
private static KafkaService singlton=new KafkaService ();
}
private KafkaService (){
//給靜態內部類傳值,存儲拉取的kafka消息
new Thread(new InnerThread(this.kafkaMessagePool)).start();
};//單例構造函數
@Geter
private Map kafkaMessagePool=null;//此處最好使用java自帶的併發map,因爲涉及多處的寫操作
private static InnerThread implement Runnable {
//消費者實例的初始化、訂閱等
}
}
其中使用了靜態內部類,但是,我平時一般都只用過內部類,不禁好奇,靜態內部類和內部類的有啥區別。
2 靜態內部類和內部類的異同點
也就是要回答:爲什麼要設計Java內部類?然後內部類還要再分爲靜態和非靜態兩種?
2.1 爲什麼要內部類
在一個類內部,需要操作某種屬性,而這個屬性需要涉及的面又很廣,我們可以考慮,將這些屬性設計爲內部類。比如,設計類 B 的目的只是爲了給類 A 使用,那麼,我們就可將其設定爲內部類,沒有必要將類 B 設置成單獨的 Java 文件,防止與其他類產生依賴關係。
說的直白一點,就是使類的內部的更加聚合,同時,避免了外部對該“聚合”部分的訪問。
2.2 靜態內部類與內部類區別
首先,來看一下靜態內部類的特點:
如果內部類與外部類關係不緊密,耦合程度不高,不需要訪問外部類的所有屬性或方法,那麼設計成靜態內部類。而且,由於靜態內部類與外部類並不會保存相互之間的引用,因此在一定程度上,還會節省那麼一點內存資源。因此,靜態內部類,和外部類沒有什麼“強依賴”上的關係,也就是說,沒有外部類提供一些屬性,內部靜態類也可以創建並初始化。
既然上面已經說了什麼時候應該用靜態內部類,那麼如果需求不符合靜態內部類所提供的一切好處,那就應該考慮使用內部類了。最大的特點就是:你在內部類中需要訪問有關外部類的所有屬性及方法。
總結一下,靜態內部類和內部類,就像靜態方法和實例方法一樣,對類的屬性/方法訪問範圍不同,靜態內部類和靜態方法只能訪問靜態屬性……
典型的使用靜態內部類的代碼就是HashMap的源碼,HashMap源碼就有個靜態內部類的經典使用,HashMap把put進去的一個key value包裝成一個Node,該Node就是靜態內部類。