我希望能够以编程方式指定键列表和每个键的允许值,以便可以在编译时检查代码是否有错误,并希望获得更好的性能。

想象一下,我在数据库中代表单词,每个单词都有许多功能:

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

09-11 18:37