Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不迭代的情况下检查枚举的成员变量_Java_Performance_Enums - Fatal编程技术网

Java 在不迭代的情况下检查枚举的成员变量

Java 在不迭代的情况下检查枚举的成员变量,java,performance,enums,Java,Performance,Enums,我有一个这样的枚举: public enum Lang { TR("tr"), EN("en"), SE("se"); private String langName; private Lang(String langName) { this.langName = langName; } } 在另一个类中,我想检查langName是否存在。如果我使用getter方法,我可以迭代langNames: for (Lang langEnum :

我有一个这样的枚举:

public enum Lang {
    TR("tr"),
    EN("en"),
    SE("se");

 private String langName;

 private Lang(String langName) {
        this.langName = langName;
    }
}
在另一个类中,我想检查langName是否存在。如果我使用getter方法,我可以迭代langNames:

for (Lang langEnum : Lang.values()) {
        langEnum.getLangName();
}
但是,我的枚举可能太长,我不想迭代数组。我想用地图或布景。另一方面,我不想在枚举中添加另一个变量


如何检查我的枚举是否有langName?

如果每个枚举常量都像代码所建议的那样代表一种语言,那么我将使用一个枚举集

Set<Lang> langs = EnumSet.allOf(Lang.class);

不确定这是否是你想要的答案。EnumSet的contains方法甚至不会迭代内部集合。内部集合将存储在一个数组中,并根据散列计算查找元素。因此,这实际上应该达到您在问题中所要求的。

好吧,如果每个enum常量都像代码所建议的那样代表一种语言,那么我将使用EnumSet

Set<Lang> langs = EnumSet.allOf(Lang.class);
不确定这是否是你想要的答案。EnumSet的contains方法甚至不会迭代内部集合。内部集合将存储在一个数组中,并根据散列计算查找元素。因此,这实际上应该达到您在问题中的要求。

使用valueOf如何

因为您的枚举名称只是大写的语言名称,所以您可以将语言名称大写并将其传递到valueOf中。

使用valueOf如何


因为您的枚举名称只是大写的语言名称,所以您可以将语言名称大写并将其传递到valueOf。

如果要使用映射,请将映射作为枚举中的静态变量,并在静态{…}块中初始化它。@LouisWasserman我做到了。然而,这是代码设计的好方法吗?如果你想使用映射来提高性能,那么…这实际上是你唯一的选择。如果你想使用映射,那么在枚举中将映射作为静态变量,并在静态{…}块中初始化它。@LouisWasserman我做到了。然而,这是代码设计的好方法吗?如果你想使用映射来提高性能,那么……这实际上是你唯一的选择。我想通过tr并检查是否有一个枚举具有langName。@kamaci好的,如果tr应该对应一个名为Lang.tr的枚举,那么你可以使用Lang.valueOflangName.toUpperCase来建议使用Lang.valueOflangName.toUpperCase。再说一次,不需要任何形式的迭代。但并非每次langName的大写字母都是Lang的值。@kamaci你运气不好,我想你在创建枚举时需要按照另一条评论中的建议填充一个映射。我想通过tr并检查是否有枚举有langName。@kamaci,如果tr应与名为Lang.tr的枚举相对应,则可以使用Lang.valueOflangName.toUpperCase。再说一次,不需要任何形式的迭代。但并非每次langName的大写字母都是Lang的值。@kamaci您运气不好,我想您需要在创建枚举时填充一个映射,正如另一条评论中所建议的那样。
Lang lang = null;

try {
  lang = Lang.valueOf(enumName);
  // enum exists
} catch (IllegalArgumentException e) {
  // enum does not exist
}