我希望能够以编程方式指定键列表和每个键的允许值,以便可以在编译时检查代码是否有错误,并希望获得更好的性能。
想象一下,我在数据库中代表单词,每个单词都有许多功能:
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);
这样很容易看到值与键匹配,但是似乎不允许使用enum语法中的enum。
我也尝试过这个:
TYPE("Type") {
public String NOUN = "Noun";
public String VERB = "Verb";
但由于某些原因不允许它们为静态,因此我无法引用TYPE.NOUN。
请问有人知道指定这样的好模式吗?我只是担心是否在我的代码中使用字符串
word.features.put(TYPE, "Noun");
我问错别字等问题。
最佳答案
您不能那样做,但是可以这样:
// 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