2011-05-29 78 views
1

我希望能夠以編程方式爲每個密鑰指定密鑰列表和允許的值,以便可以在編譯時檢查代碼中的錯誤並希望獲得更好的性能。我可以在枚舉中聲明枚舉以指定/限制Java中的映射中的鍵和值嗎?

想象我代表字在數據庫中,每個字有許多特點:

public class Word { 

    public Map<Feature, FeatureValue> features = new EnumMap<Feature, FeatureValue>(); 

} 

而且我有一個枚舉類:

public enum Feature { 

    TYPE("Type") { 

    enum Value { 
    NOUN("Noun"), 
    VERB("Verb"); 
    } 

    @Override 
    public Value[] getValues() { 
    return new Value[]{Value.NOUN, Value.VERB}; 
    } 

}, 


    PLURALITY("Plurality") { 

    enum Value { 
    SING("Singular"), 
    PL("Plural"); 
    } 

    @Override 
    public Value[] getValues() { 
    return new Value[]{Value.SING, Value.PL}; 
    } 

}, 

} 

我至少希望能夠做類似的事情:

word.features.put(TYPE,TYPE.VALUE.NOUN); word.features.put(PLURALITY,PLURALITY.Value.PL);

因此,很容易看出這些值與鍵匹配,但枚舉語法中的枚舉似乎不被允許。

我也試過這樣:

TYPE("Type") { 

public String NOUN = "Noun"; 
public String VERB = "Verb"; 

但由於它們不能是靜態出於某種原因我無法引用TYPE.NOUN。

請有人知道一個很好的模式來指定這樣的東西?我只是擔心,如果在我的代碼一樣

word.features.put(TYPE, "Noun"); 

使用字符串我找麻煩用錯別字等

回答

1

你不能那樣做,但你可以做這樣的:

// define a type values as an enum: 
enum TypeValue { 
    Noun, Verb 
} 

// define an attribute class parametrized by an enum: 
public class Attribute<E extends Enum<E>> { 

    // define your attribute types as static fields inside this class 
    public static Attribute<TypeValue> Type = new Attribute<TypeValue>(); 
} 

// and now define your method like this: 
<E extends Enum<E>, Feature extends Attribute<E>> void put(Feature feature, E value) { 
} 

// you will then have a compilation error when trying to invoke the method with improper associated parameters. 

// eg if we define 
enum OtherValue { X } 

features.put(Attribute.Type, TypeValue.Noun); // ok 
features.put(Attribute.Type, OtherValue.X); // Fails 
+0

Thanks Toader!我會試試這個。我不太明白,Feature類在哪裏?我不能只用: 'E擴展枚舉,屬性> void put(屬性功能,E值){' – 2011-05-30 10:10:44

+0

這是我最初的想法:)。如果你想使它更簡單,你應該一路走下去:'E擴展枚舉> void put(屬性特徵,E值)' – 2011-05-30 15:17:59