2013-01-20 72 views
2

目前我聲明,像這樣我的所有靜態字段:OOP設計:靜態字段

public static final int EXAMPLE_OF_STATIC_FIELD = 0; 

說我有一個代表,可以在類中ocurre所有錯誤字段的基類:

public class Base { 

    public static final int ERROR_1 = 0; 
    public static final int ERROR_2 = 1; 
    public static final int ERROR_3 = 2; 

} 

如果我擴展這個基類,我想更多的Error types添加到類,我會做到以下幾點:

public class OffSpring extends Base { 

     public static final int NEW_ERROR_1 = 3; 

    } 

對於我宣佈新的Error types,我需要知道基類的Error types的價值,這在我看來不是很方便,因爲我可以不經意地在Base class的後代類別中聲明Error Type值爲Base classError type。例如:

public static final int NEW_ERROR_1 = 0; 

這將是相同的

public static final int ERROR_1 = 0; 

這會衝突...

我想,也許使用Enum Class,然而事實證明,你不能擴展它。 Can enums be subclassed to add new elements?

另一種選擇是使用字符串值類型,而不是int值類型的所有靜態字段,但是這並不是一個非常有效的解決方案......

我如何添加更多領域的一個階級的後代,沒有他們與超級階級衝突?

+0

如果您直接定義常量,總會有錯誤的可能性。怎麼樣使用GUID? – SJuan76

回答

3

我懷疑你是否真的想做這個。如果常量對它們的聲明類是私有的,那麼爲什麼它們重用相同的值呢?如果存在重要的情況,即不同的錯誤不使用相同的值,則強烈建議他們實際上不應該是私人的。

如果你真的想這樣做,你可以做這樣的事情:

public class Base { 
    private static final int ERROR_1 = 0; 
    private static final int ERROR_2 = 1; 
    private static final int ERROR_3 = 2; 
    protected static final int LAST_ERROR = ERROR_3; 
} 

public class OffSpring extends Base { 
    private static final int NEW_ERROR_1 = Base.LAST_ERROR + 1; 
} 

如果你想擁有的Base每個定義自己的錯誤代碼,雖然多個子類,你在麻煩。

+0

(obsolate)雖然這回答了這個問題,但請記住artragis關於無法訪問基類的私有字段的說法。 – Vincent

+0

嗯......如果有人將新的價值插入到'Base'類中呢?在這種情況下,所有的偏移常數將增加1。如果這些常量在某些數據庫表中用作特殊狀態值呢? – Andremoniy

+0

謝謝,這似乎是允許的。對不起,這些字段應該是公開的。 –

1

爲什麼不把你的錯誤類型存儲在地圖中,這樣你就可以檢查錯誤類型是否被聲明,因爲這是你想要做的。

有一個Map<String, int> error_types。當你繼續添加更多的時候,你可以在基類上進行檢查並避免衝突。

2

我看不到您的問題,因爲private static final不是繼承屬性。 您將無法訪問OffSpring.ERROR_1它不存在。 所以如果你想使用錯誤,你可以選擇使用枚舉並以正確的方式使用它們。 如果你做prefere整數,這是因爲你想使用黑客像錯誤組合,所以你不能使用值3

我該怎麼稱錯誤組合? 假設你的腳本因爲兩個錯誤而失敗,ERROR_1和Error_2 如果ERROR_1是1,ERROR_2是2,如果你說你的代碼3有錯誤,你說你有ERROR_1,ERROR_2是1,二進制編碼爲01, 2爲10。3就是其中的兩個組合:11

如果你想爲所有的自定義錯誤的唯一標識,使用GUID生成器,例如

public class GUIDGenerator{ 
    private int id = 1; 
    public int getId(){ 
      return id++; 
    } 
}