如何在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"; } } } 

我知道这些信息可以在枚举中找到。

  1. 如何打印所有枚举值,如: print.generalInformation

那输出:

名称
教育
电子邮件
电话

  1. 如何将枚举generalInformation作为另一个函数中的arg传递?

 System.out.println(java.util.Arrays.asList(generalInformation.values())); 

你的第二部分……就像interfaceclass

首先,我将重构您的枚举以在构造函数参数中传递字符串表示。 该代码位于底部。

现在,要打印所有枚举值,您只需使用以下内容:

 // 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(); } }