如何在java中打印所有枚举值?
enum generalInformation { NAME { @Override public String toString() { return "Name"; } }, EDUCATION { @Override public String toString() { return "Education"; } }, EMAIL { @Override public String toString() { return "Email"; } }, PROFESSION { @Override public String toString() { return "Profession"; } }, PHONE { @Override public String toString() { return "Phone"; } } }
我知道这些信息可以在枚举中找到。
- 如何打印所有枚举值,如:
print.generalInformation
?
那输出:
名称
教育
电子邮件
电话
- 如何将枚举
generalInformation
作为另一个函数中的arg传递?
System.out.println(java.util.Arrays.asList(generalInformation.values()));
你的第二部分……就像interface
或class
首先,我将重构您的枚举以在构造函数参数中传递字符串表示。 该代码位于底部。
现在,要打印所有枚举值,您只需使用以下内容:
// Note: enum name changed to comply with Java naming conventions for (GeneralInformation info : EnumSet.allOf(GeneralInformation.class)) { System.out.println(info); }
使用EnumSet
的另一种方法是使用GeneralInformation.values()
,但这意味着每次调用它时都必须创建一个新数组,这对我来说是浪费。 不可否认,每次调用EnumSet.allOf
需要一个新对象…如果你这么做并且关注性能,你总是可以将它缓存到某个地方。
在参数方面,您可以像使用任何其他类型一样使用GeneralInformation
:
public void doSomething(GeneralInformation info) { // Whatever }
用一个值调用,例如
doSomething(GeneralInformation.PHONE);
使用构造函数参数进行重构
public enum GeneralInformation { NAME("Name"), EDUCATION("Education"), EMAIL("Email"), PROFESSION("Profession"), PHONE("Phone"); private final String textRepresentation; private GeneralInformation(String textRepresentation) { this.textRepresentation = textRepresentation; } @Override public String toString() { return textRepresentation; } }
使用您当前的值,您实际上可以自动将名称转换为标题大小写 – 但从长远来看这不会非常灵活,我认为这个显式版本更简单。
从Java 8开始,我建议使用以下解决方案:
public static String printAll() { return Stream.of(GeneralInformation.values()). map(GeneralInformation::name). collect(Collectors.joining(", ")); }
在应用程序中,将数据与表示分开是一种很好的做法。 它允许数据在不同的用户界面中使用,它使数据对象更轻量级,并允许未来的国际化可能性。
考虑到这一点,最好避免将显示名称强烈耦合到枚举常量。 幸运的是,有一个类使这很容易:EnumMap。
public class ApplicationUI { private final Map names; public ApplicationUI() { names = new EnumMap<>(GeneralInformation.class); names.put(GeneralInformation.NAME, "Name"); names.put(GeneralInformation.EDUCATION, "Education"); names.put(GeneralInformation.EMAIL, "Email"); names.put(GeneralInformation.PROFESSION, "Profession"); names.put(GeneralInformation.PHONE, "Phone"); assert names.keySet().containsAll( EnumSet.allOf(GeneralInformation.class)) : "Forgot to add one or more GeneralInformation names"; } public String getNameFor(GeneralInformation info) { return names.get(info); } }
如果你还在使用Java 1.7,这对我有用:
String genInfoValues = ""; boolean firstRun = true; for (generalInformation info : generalInformation.values()){ if (firstRun) { firstRun = false; genInfoValues += info.name(); } else { genInfoValues += ", " + info.name(); } }