如何以编程方式定义Java枚举?

时间:2015-07-06 21:49:09

标签: java enums

我需要在Java中定义一个Enum类型。但是,枚举中的值取决于参数。

public class EnumTest {

    private Language lang;

    public enum Language {English, Spanish, Chinese, German, Japanese;}

    public enum Entity {

        // ??? 
        entityA("student"),
        entityB("faculty"),
        entityC("staff");

        private String name;

        Entity(String name) {
            this.name = name;
        }
    }

    public EnumTest(Language lang) {
        this.lang = lang;
    }

    public static void main(String[] args) {
        EnumTest testA = new EnumTest(Langauge.English);
        EnumTest testB = new EnumTest(Language.Spanish);
    }
}

例如,如果参数不是Langauge.English,则entityA,entityB,entityC的实例化将不是“student”,“faculty”和“staff”。它将是用其他语言翻译成英文的相应单词。因此,枚举实体的定义取决于参数Lang。

我怎样才能实现?

2 个答案:

答案 0 :(得分:1)

您可以将不同的翻译存储在枚举内的字段中。

public enum Entity {

    EntityA("student", "translation1", "translation2", "translation3", "translation4"),
    EntityB("faculty", "translation1", "translation2", "translation3", "translation4"),
    EntityC("staff", "translation1", "translation2", "translation3", "translation4");

    public String[] names;

    private Entity(String english, String spanish, String chinese, String german, String japanese) {
        names = new String[]{english, spanish, chinese, german, japanese};
    }
}

然后,您可以使用以下方法获得适当的翻译:

public String getTranslation(Entity entity, Language lang){
    return entity.names[lang.ordinal()]; // ordinal returns the id of the enum instance. The first declared has 0, the second has 1 and so on
}

所以,下面的代码

getTranslation(Entity.EntityA, Language.Spanish)

会返回“translation1”。

答案 1 :(得分:1)

Java中enum类型的主要优点是编译器能够知道并在编译时能够访问所有实例。在运行时定义或修改枚举值,即使在测试中,也会破坏Java枚举及其支持的保证和优化(例如序列化,VM范围的单例属性以及明确定义的ordinalvalues[] )。

您可以考虑一些替代方案:

  • Entity保留为枚举,并在运行时加载一个保留本地化名称的长期Map<Entity, String>后不久。

  • 限制对“Entity”构造函数的访问(使类实例受控),然后通过方法或一系列方法提供实例。

  • 让枚举上的所有本地化字符串都使用某种表格实例(例如“属性”或“地图”),用于根据外部保存的密钥提取正确的名称。