我需要在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。
我怎样才能实现?
答案 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范围的单例属性以及明确定义的ordinal
和values[]
)。
您可以考虑一些替代方案:
将Entity
保留为枚举,并在运行时加载一个保留本地化名称的长期Map<Entity, String>
后不久。
限制对“Entity”构造函数的访问(使类实例受控),然后通过方法或一系列方法提供实例。
让枚举上的所有本地化字符串都使用某种表格实例(例如“属性”或“地图”),用于根据外部保存的密钥提取正确的名称。