2011-09-15 25 views
5

我一直在尋找一些由離岸組織開發的代碼。我看到每個模塊至少定義了一個「常量接口」。 例如(不是真實世界):常量界面最優雅的選擇是什麼?

public interface RequestConstants{ 
    //a mix of different constants(int,string,...) 
    public static final int MAX_REQUESTS = 9999; 
    public static final String SAMPLE_REQUEST = "Sample Request"; 
} 

按我的理解它是一個反模式,因爲這些並不在運行時的任何工具,並應避免或以不同的方式解決。 什麼是優雅的方式來表達這一點?可以用enums代替嗎?

+0

哇!反對票。但爲什麼? –

+0

我建議嚴格測試他們的編程功能,而不是擔心這樣的問題,直到你發現功能受損爲止。 – emory

回答

1

除非所有參數密切相關,否則En enum可能不是一個好主意。用你的例子中的兩個參數我會說他們沒有足夠的相關性作爲枚舉。

但是,包含像這樣的常量類/接口並不一定是個壞主意。它具有集中式的優勢,這意味着這個配置可以很容易地移到程序之外 - 例如一個屬性文件,一個命令行解碼器,一個數據庫甚至是一個套接字接口,這對系統的影響最小其他類。這是一個真正的設計將採取什麼方向的問題。但是,除非你正在考慮沿着這條路走下去,否則,我會說在使用相應參數的類中的靜態決賽是要走的路,正如已經提出的那樣。

+0

我同意。使用枚舉和或類而不是接口可能會破壞現有代碼。我不認爲這是一種嚴重的反模式。 – emory

0

使用private構造函數將接口轉換爲final類。

+1

這將是不錯的... –

6

我喜歡把常量在他們做他們最相關的類,然後如果我指它們放在別的地方,只是這樣做 - 使用靜態進口可能如果是有道理的(例如,對於Math.PI)。

在接口中放置常量的唯一真正原因是允許您「實現」無方法接口並通過它們的簡單名稱訪問常量,而無需進一步限定。靜態導入刪除該原因。

+1

在某些情況下靜態進口並不能完全達到預期的效果。如果我在.java文件中有多個類(例如嵌套文件),每個類都可以有自己的一組常量,其中一些可以有重疊名稱。使用靜態導入意味着衝突。 – emory

+0

@emory:對。另一方面,我不想在這種情況下使用接口技巧 - 具有相同的常量名稱意味着在同一個文件中不同的東西對我來說聽起來像一個壞主意。 –

+0

@Jon Skeet - 「將常量放在接口中的唯一真正原因是允許你」實現「無方法接口並通過它們的簡單名稱訪問常量」 - 聽起來很有趣。但是,從面向對象的角度來看,這不是一個糟糕的做法 - 這與現實世界有什麼關係? - 感謝您的回答。 –

0

使用最終的非實例化類,即一個具有私有構造函數。

+1

...如果對這些答案的評價已被解釋。 –

相關問題