2012-04-16 84 views
5

首先,如果這是現有問題的重複,請致歉。我不確定如何說出我的問題,這可能是爲什麼我還沒有找到明確的答案。從本質上講,我想知道如果下面被認爲是很好的做法,或者有更好的方法來做到這一點:是否使用對象實例化作爲枚舉項的值良好實踐?

public enum ExampleEnum { 
    ENTRY_1(new ExampleCodedValue("entry1", "comment1")), 
    ENTRY_2(new ExampleCodedValue("entry2", "comment2")), 
    ENTRY_3(new ExampleCodedValue("entry3", "comment3")), 
    ENTRY_4(new ExampleCodedValue("entry4", "comment4")); 

    private ExampleCodedValue codedValue; 

    ExampleEnum(ExampleCodedValue codedValue) { 
     this.codedValue = codedValue; 
    } 

    public ExampleCodedValue getCodedValue() { 
     return codedValue; 
    } 
} 

class ExampleCodedValue { 

    private final String code; 
    private final String comment; 

    ExampleCodedValue(String code, String comment) { 
     this.code = code; 
     this.comment = comment; 
    } 
} 

回答

11

然而,這是一個完全合理的方式做到這一點,不能你這樣做:

public enum ExampleEnum { 
    ENTRY_1("entry1", "comment1"); 

    private final String entry; 
    private final String comment; 

    private ExampleEnum(String entry, String comment) { 
     ... 
    } 
} 
+1

+1吻原則。順便說一句,我通常創建帶有字段的枚舉(像這樣)。他們可以非常方便。 – Bohemian 2012-04-16 01:12:22

+0

主要原因是這個枚舉和其他類似的枚舉使用了'ExampleCodedValue'的通用數據類型。例如,你可能有兩個枚舉,'Settings'和'Attributes'。每個由代碼和評論組成。這是對我的實際用例的過分簡化,但是這兩個枚舉在封裝方面是不同的。我也考慮過使用@Jeffery的例子,並且有一個返回'ExampleCodedValue'類型的訪問器方法。也許這是一個更好的方法來做到這一點? – speedRS 2012-04-16 01:49:04

+0

@speedRS我只是想知道爲什麼你會爲了創建一個沒有提供額外功能的對象而煩惱。但是由於您的用例需要具有該特定對象,因此您的原始示例沒有任何問題。 – Jeffrey 2012-04-16 01:50:22

-1

首先,爲什麼不能只需添加的代碼和註釋屬性的枚舉本身?這似乎完全沒有意義。

1

這是很好的,因爲你的ExampleCodedValue是不可改變的。

但是,如果它只是一個價值容器,問問自己是否有充分的理由不把這些字段直接放入enum。一個很好的理由可能是你的價值對象在概念上與枚舉的其他領域分開。

枚舉中包含的對象的另一個用例是使用多態性爲每個對象提供不同的功能。例如:

PAINT_BRUSH(new PaintTool()), 
ERASER(new EraserTool()); 

隨着PaintToolEraserTool的​​左右不同的實現。

在這一點上,你可能會問自己,雖然,我還受使用enum做出選擇的地方,我也可以省略enum乾脆而直接使用Tool實例......此外,傳統上,枚舉唐不圍繞功能旋轉。