如何修改Java枚举以支持直接访问多语言ID属性?
实现枚举常量直接通过
.ENGLISH/.TAMIL获取对应ID的方案 你想要的TransliterationKeys.FULL_NAME.ENGLISH这种访问语法完全可以实现,核心思路是给每个枚举实例添加公开的final整数字段,在构造方法中初始化对应ID值即可。下面是兼顾原有transliterationKey字符串的完整实现:
@Getter public enum TransliterationKeys { FULL_NAME("Full Name of the Applicant", 1, 2), NAME_TO_BE_INCLUDE_IN_IC("Name to be included IC", 6, 7), GENDER("Gender", 4, 5); // 保留原有字符串字段 private final String transliterationKey; // 公开的语言ID字段,支持直接访问 public final int ENGLISH; public final int TAMIL; TransliterationKeys(String transliterationKey, int englishId, int tamilId) { this.transliterationKey = transliterationKey; this.ENGLISH = englishId; this.TAMIL = tamilId; } }
为什么你的原始设想不可行?
你写的FULL_NAME(ENLIGH(1), TAMIL(2))语法在Java中不合法:枚举的构造参数必须是编译期可确定的合法值,ENLIGH(1)这种写法既不是已定义的类型,也不是有效的方法调用,编译器无法识别。
其他可选方案(如果需要扩展更多语言)
如果后续可能新增更多语言类型,用内部枚举+Map的方式更易扩展,但访问语法会变成方法调用:
@Getter public enum TransliterationKeys { FULL_NAME("Full Name of the Applicant", Map.of(Language.ENGLISH, 1, Language.TAMIL, 2)), NAME_TO_BE_INCLUDE_IN_IC("Name to be included IC", Map.of(Language.ENGLISH, 6, Language.TAMIL, 7)), GENDER("Gender", Map.of(Language.ENGLISH, 4, Language.TAMIL, 5)); private final String transliterationKey; private final Map<Language, Integer> languageIdMap; TransliterationKeys(String transliterationKey, Map<Language, Integer> languageIdMap) { this.transliterationKey = transliterationKey; this.languageIdMap = languageIdMap; } public int getLanguageId(Language language) { return languageIdMap.getOrDefault(language, -1); // 默认返回-1避免空指针 } // 内部枚举定义语言类型 public enum Language { ENGLISH, TAMIL } }
使用方式:TransliterationKeys.FULL_NAME.getLanguageId(Language.ENGLISH)
总结
如果只需要支持ENGLISH和TAMIL两种语言,第一种直接定义公开字段的方案最简洁,完全符合你想要的访问语法。
内容的提问来源于stack exchange,提问作者ranidu harshana
相关产品推荐
相关产品推荐

