2012-08-01 37 views
0

最近,我發現了以下結構的驗證碼的正確和錯誤的方法來編寫Java枚舉

接口

public interface Base<T> { 

    public T fromValue(String v); 

} 

枚舉實現

public enum AddressType implements Base<AddressType> { 

    NotSpecified("Not Specified."), 

    Physical("Physical"), 

    Postal("Postal"); 

    private final String label; 

    private AddressType(String label) { 
     this.label = label; 
    } 

    public String getLabel() { 
     return this.label; 
    } 

    @Override 
    public AddressType fromValue(String v) { 
     return valueOf(v); 
    } 
} 

我的直接反應是,無法通過反序列化或反思創建一個枚舉的實例因此,fromValue()應該是靜態的。

我不是想開始辯論,但這是正確的嗎?我已閱讀,Why would an Enum implement an interface,我完全同意所提供的答案,但上述示例無效。

我這樣做是因爲「架構師」不想接受我的答案,所以這是爲了創建一個強有力的論點(與事實)爲什麼上述方法是好的/壞的。

+0

除了枚舉,還有其他類實現接口嗎? – 2012-08-01 09:54:44

+0

@Edwin Dalorzo,不。只有接口。 – 2012-08-01 09:55:14

回答

1

您的Base接口不聲明valueOffromValue方法確實實施。我沒有看到這個代碼不能編譯的原因。如果您指的是fromValue中的valueOf調用,那麼將調用爲每個枚舉定義的靜態方法。不過,我必須同意,它的設計是錯誤的,因爲你需要一個任意的枚舉成員才能調用fromValue並獲得真正的成員。

另一方面,在我現在正在做的項目中,我有幾個枚舉實現了一個通用接口。這是因爲枚舉是相關的,我希望能夠根據它們的通用語義統一處理它們。

+0

甜,謝謝...我混合'fromValue'和'valueOf',但另一個參數仍然存在。 – 2012-08-01 09:50:07

1

在我看來這種設計是錯誤的。爲了使用valueFrom(),必須事先獲得此枚舉的實例。因此,它看起來像:

AddressType type = AddressType.Postal.valueFrom("Physical"); 

它有什麼意義?

0

您的基本界面似乎服務於其他目的(如果有的話)。

它可能是一個字符串到T轉換器,因爲它從一個字符串生成一個T. enum是完全錯誤的,如果它實現了這個接口(@ yegor256已經指出了原因)。所以你可以保留枚舉,你可以有一些AddressTypeConverter implements Base<AddressType>它調用AddressType.valueOf()在其fromString()方法。

但是不要誤會我的意思:枚舉實現接口並不是一個壞習慣,只是這種特殊的用法是完全錯誤的。