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