簡體   English   中英

在單例中聲明變量static

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM