簡體   English   中英

靜態最終成員變量與get方法

[英]Static final member variables vs. get methods

我有一個包含所有來自屬性文件的配置的類。

我的第一個解決方案是:

public class Config {

    public static final int disc;

    static {

        // Read property file and set properties

        disc = 5;
    }
}

以這種方式讀取信息:

System.out.println(Config.disc);

第二種解決方案是:

public class Config {

    private int disc;

    public void Config() {

        // Read property file and set properties

        disc = 5;
    }

    public int getDisc() {
        return this.disc;
    }
}

以這種方式閱讀:

System.out.println(new Config().getDisc());

最好的方法是什么,為什么? 有什么優缺點?

答案取決於disc的含義:

  • 如果disc代表一個常數,本質上是給數值起一個名字,那么比public final字段更好
  • 如果disc表示的值可能因用戶的操作而改變(即,如果它是配置的一部分),則首選帶有getter的私有變量。

第二種方法為您提供了更大的靈活性,如果您將來決定重構您的類:它可以讓您在以后的時間初始化私有disc ,或用其他獲取值的方式替換它,例如通過從其他值計算得出,或從另一個對象讀取。

使用getDisc() ,每個對象可以有一個光盤變量,而所有實例之間都共享static disc

  • 如果您對類的每個實例具有不同的disc值,則請采用第二種方法。
  • 如果您具有需要在類的所有實例之間共享的相同值,請使用第一種方法

通過它們,您將無法執行System.out.println(Config.getDisc()); 您不能使用類名調用非靜態方法

那怎么辦: public static final int DISC = 5; 然后,您可以使用Config.DISC訪問您的配置值。

System.out.println(Config.getDisc());

錯了 您不能使用類名稱調用非靜態方法。 您必須創建一個對象,如下所示:

Config cfg = new Config();
System.out.println(cfg.getDisc());

現在,在您的第一種情況下,所有實例將共享disc相同副本。 因此,如果不是常數,請選擇第二種情況。

軟件工程原理要求“ 信息隱藏 ”。 在您的第一個解決方案中,“ disc”屬性是公共的,並且該屬性可以在任何地方使用,並且違反了“信息隱藏”的原則。 我投票贊成您的第二個解決方案,並建議您將“光盤”設為私有。

在這種情況下,您真正​​想要的是

public static final int DISC = 5;

System.out.println(Config.DISC);

(請注意,像這樣的成員通常總是用英文寫成)。


您的第一個解決方案有一個錯誤。 它不會編譯,因為您嘗試多次設置一個final字段。 每次創建new Config() ,都將為disc分配一個值,但是由於它是最終值,因此無法正常工作。 您可能想要建議的是將其放入靜態構造函數中:

public class Config
{
    public static final int DISC;
    static
    {
        DISC = 5;
    }
}

但是,我不建議這樣做,因為完全可以找到我寫的第一個方法,而且也容易得多。

您的第二個解決方案中有一個錯誤。 它不會編譯,因為您不能從靜態上下文訪問非靜態方法。 這意味着您必須先創建Config的實例,然后才能調用getDisc()方法。 在這種情況下,更好的解決方案是將方法聲明為靜態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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