[英]declaring variable static in singleton
實現單身時:
class MyConnection {
private static MyConnection connection = new MyConnection();
private MyConnection() {
}
public static MyConnection getConnection() {
return connection;
}
}
1)為什么我們將connection
作為靜態?
這只是因為getConnection()
是靜態的,我們不能在靜態上下文中引用非靜態或者還有其他原因嗎?
2)是否有必要將connection
聲明為最終?
1)為什么我們將
connection
作為靜態?
如果它是非靜態的,你需要有一個MyConnection
實例來獲取connection
引用,這種方法會破壞目的。 :)
這只是因為
getConnection()
是靜態的,我們不能在靜態上下文中引用非靜態或者還有其他原因嗎?
是。 (因為getConnection()
需要是靜態的,所以connection
需要是靜態的。)
2)是否有必要將連接聲明為最終?
不,但這是一種很好的做法,因為一旦初始化,就不應該改變。
但是, 更好的做法是使用enum
。
enum MyConnection {
INSTANCE;
// your methods...
}
並通過MyConnection.INSTANCE
訪問它。
經驗法則 :如果一個類具有預定義數量的實例,請使用enum
。 在這種情況下,實例的數量是一個。
1)為什么我們將連接作為靜態?
因為你想要它是單身人士。 即使您沒有通過靜態方法訪問它,也可以通過將static variable by making it public and final
來訪問static variable by making it public and final
。 但是,變量必須是靜態的。
2)是否有必要將連接聲明為最終?
如果您通過代碼中的靜態方法訪問,則不需要,因為它不會暴露在外部以進行修改。
但是如果你將單例變量公之於眾,那么它也必須是最終的。
Singleton是一個你只有一個實例的類。 在Java中,實現該模式的最常用方法是聲明private
構造函數以防止正常初始化,並使用public static
方法來提供單個實例。 (但是aioobe的枚舉答案很酷!)
可以在沒有類實例的情況下調用靜態方法,允許您執行類似MySingleton.getInstance()
- 但是,由於您無法保證擁有類的實例,因此無法訪問實例變量。 通過將變量聲明為static
您將其聲明為“類變量” - 允許以與靜態方法相同的方式訪問它,並允許靜態方法訪問它(同樣,靜態方法無法訪問非靜態變量,因為無法保證它們存在,我們無論如何都不知道要查看哪個實例。 所以回答1)這是因為如果你需要一個單例的實例來查找單例的實例,你就有了一個捕獲22。
至於2)你不需要聲明它是最終的,但是宣布任何可以是最終的,最終的是好的形式。 這樣你就明確了你的意圖,如果你犯了錯誤,編譯器可以幫助你。 它應至少是最終的或私人的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.