Java的枚举valueOf()与多个值?

我在使用枚举Java的问题。 我已经阅读了有关为Enums赋值参数的文档。 但是,我的问题是多重价值是什么,可能吗?

这是我想实现的:我有一个语言的枚举。 每种语言都由其名称和一些较短的别名表示(并不总是,并不总是相同数量的别名)

这里是一个例子:

public enum Language{ English("english", "eng", "en", "en_GB", "en_US"), German("german", "de", "ge"), Croatian("croatian", "hr", "cro"), Russian("russian") } 

我可以像这样定义一个枚举,并通过调用Language.valueOf()获得正确的枚举值?

这可能类似于你想要实现的。

 public enum Language{ English("english", "eng", "en", "en_GB", "en_US"), German("german", "de", "ge"), Croatian("croatian", "hr", "cro"), Russian("russian"); private final List<String> values; Language(String ...values) { this.values = Arrays.asList(values); } public List<String> getValues() { return values; } } 

记得枚举是一个像其他人一样的类, English("english", "eng", "en", "en_GB", "en_US")正在调用枚举构造函数。

然后你可以通过search方法来检索对应于string的枚举值(你可以把它作为一个静态方法再次在枚举中)。

 public static Language find(String name) { for (Language lang : Language.values()) { if (lang.getValues().contains(name)) { return lang; } } return null; } 

将string映射到枚举值通常是valueOf静态方法为您所做的。 所以如果你想用同义词来完成这个,你将不得不开发类似的东西。 但是我们不想给出一个我们可以重写静态方法的存在,所以我们只是为了这个目的命名它: fromString应该是合适的。

 public enum Language { ENGLISH("eng", "en", "en_GB", "en_US"), GERMAN("de", "ge"), CROATIAN("hr", "cro"), RUSSIAN("ru"), BELGIAN("be",";-)"); static final private Map<String,Language> ALIAS_MAP = new HashMap<String,Language>(); static { for (Language language:Language.values()) { // ignoring the case by normalizing to uppercase ALIAS_MAP.put(language.name().toUpperCase(),language); for (String alias:language.aliases) ALIAS_MAP.put(alias.toUpperCase(),language); } } static public boolean has(String value) { // ignoring the case by normalizing to uppercase return ALIAS_MAP.containsKey(value.toUpperCase()); } static public Language fromString(String value) { if (value == null) throw new NullPointerException("alias null"); Language language = ALIAS_MAP.get(value); if (language == null) throw new IllegalArgumentException("Not an alias: "+value); return language; } private List<String> aliases; private Language(String... aliases) { this.aliases = Arrays.asList(aliases); } } 

作为这种types的实现的一个好处,我们可以像展示的那样轻松地实现静态方法来testing一个给定的别名是枚举值集合的一部分。 同时,我们应用了一些很好的命名约定:

  • 枚举值以大写字母表示,表示它们实际上是静态的最后一个(单例实例)。
  • 同时,我们也把所有其他的静态决赛全部上限。

请注意,我们不必重复枚举值本身的名称:我们始终认为它是自己的名称(被添加到ALIAS_MAP),并且在顶部我们将所有内容标准化为大写,以使其不区分大小写。

看起来很大,但使用枚举时,它看起来很漂亮:

 public void main() { Language myLanguage = Language.fromString("en_GB"); if (myLanguage == Language.ENGLISH) { System.out.println("Yes, I know, you understand English!"); } } 

别名的后备容器是一个Map ,一个更具体的HashMapHashMap提供了别名的快速访问path,并且也容易增长。 每当我们想到索引某个东西的时候,一个HashMap应该是我们的第一select。

请注意,为了透明使用,我们存储枚举常量本身的name()通过name()方法检索)以及所有别名。 我们可以通过首先尝试使用内置的valueOf静态方法执行查找来实现这一点。 这是一个deviseselect,但我们可能要处理额外的例外等。

总之,没有。

valueOf()方法的参数只能是枚举常量types的string。 所以它不能改变,或查找可能的值。 请参阅JavaDoc 。

您需要编写自己的实用程序方法来为给定的值返回适当的枚举types。

规范化数据:

 public enum LanguageCode { ENGLISH, GERMAN, CROATIAN, RUSSIAN, // ... } // (add whatever initialization you want to that 

然后

 public enum Language{ english(ENGLISH), eng(ENGLISH), en(ENGLISH), en_GB(ENGLISH), // ... } 

等等

哇,真的很快回复:)谢谢你们。

安迪是对的。 我想调用Language.valueOf(“eng”)或Language.valueOf(“english”)并获得Language.English作为返回。

我已经有一个实用的function,但它不是很好。 开关函数检查string值并返回适当的枚举实例。

但有很多代码重写(我有cca 30-40语言)。 如果我想添加一个语言,我必须将它添加到枚举,并在实用程序类中执行新的检查。

我会尝试Flavios的方法。 只是一个问题。 你的构造函数,不是吗?

 Language(List<String> values) { this.values = Arrays.asList(values); } 

或者添加一个方法,如果结构更复杂,那么你的枚举和构造函数可以更干净:

 public Language getLanguage(String code){ switch(code){ case "en": case "en_GB": ... case "eng": return ENGLISH; case "rus": case "russian": return RUSSIAN; } }