java:靜態內部類和內部類區別及作用

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就是靜態內部類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章