簡體   English   中英

Java,接口或常量類的組成

[英]Java, interface or composition for constants class

我對程序設計有疑問。 我有一個存儲公共常量的類A,這樣我就可以在另一個類中使用這些常量。

public static final String error_code1 = "Fatal Error";
public static final String error_code2 = "XXXX";
...
...

在組成與接口之間,我不知道哪個1更合適。 從我的想法來看,由於我只需要常數即可進行程序中的值比較,因此我認為組合就足夠了(低耦合)。

但是你們可以從軟件設計的角度給我一些建議/觀點嗎? (內聚,耦合,維護困難等)

首先,我建議您在這種情況下使用枚舉。

public enum ErrorCode {
    FATAL_ERROR("Fatal Error"),
    X_ERROR("XXXX");

    public final String msg;
    private ErrorCode(String msg) {
        this.msg = msg;
    }
}

如果由於某種原因這不適合您,我將使用帶有私有(未使用)構造函數的final實用工具類。

無論如何,由於這些字段是靜態的和最終的,因此我不會考慮引用A或實現A來獲取常量。

向接口添加常量被認為是反模式,因為接口的主要目的是定義行為契約。 因為它們是公共的,所以可以使用一個枚舉或直接訪問它們。

我不會使用接口來存儲常量,因為將靜態成員包含在接口中(並實現該接口)是一種不好的做法 ,甚至還有一個名稱,即常量接口反模式 ,請參見[Effective Java] [1],條目17:

恆定接口模式是對接口的不良使用 類內部使用一些常量是一個實現細節。 實現常量接口會導致此實現細節泄漏到類的導出API中。 對類的用戶而言,該類實現一個常量接口並不重要。 實際上,這甚至可能使他們感到困惑。 更糟糕的是,它表示一種承諾:如果在將來的版本中對該類進行了修改,使其不再需要使用常量,則它仍必須實現該接口以確保二進制兼容性。 如果非最終類實現了常量接口,則其所有子類的名稱空間都會受到接口中常量的污染。

我個人會去枚舉,如果需要,我什至可以用它來顯示錯誤代碼或添加相關的字段/方法。

String / int / ...另一個類中的常量有一個問題:將它們復制到using類的常量池中,此后不存在對原始類的導入。 然后,如果您更改常量的值,則不會強制重新編譯using類。

解決的辦法是使用一個接口,並“實現”該接口。 丑陋的。 更好的是使用一個枚舉。

對於開放式價值域,將不使用枚舉,而是一種面向對象的方法:

abstract class ParseError extends RuntimeException
class ExpressionExpectedError extends ParseError
class DigitsMayNotFollowLeadingZeroError extends ParseError
..

在javadoc中,可能會看到ParseError的所有子類。 在這里,類本身形成域值,並且實例化包含實際的上下文信息。 那是更多的OOP。 在對象上調用多個方法比在常量上具有多個開關要好。 但是,枚舉也可以與分類方法一起使用: boolean errorHandledBySkippingToNextExpr()

暫無
暫無

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

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