【问题标题】:How to print all enum values in Java?如何在 Java 中打印所有枚举值?
【发布时间】:2013-01-19 10:53:11
【问题描述】:
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 作为参数传递给另一个函数?

【问题讨论】:

  • 您不必在每个枚举元素中重写 toString 方法。每个枚举都有方法 name(),它返回调用此方法的元素的字符串表示形式:SomeEnum.VALUE.name() 将返回“VALUE”字符串。你可以只在你的主要toString()return name().charAt(0)+name().substring(1).toLowerCase(); 就像这里ideone.com/IraxgB

标签: java enums


【解决方案1】:
System.out.println(java.util.Arrays.asList(generalInformation.values()));

您的第二部分...与interfaceclass 相同

【讨论】:

    【解决方案2】:

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

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

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

    使用您的 current 值,您实际上可以自动将名称转换为标题大小写 - 但从长远来看,这不会很灵活,而且我认为这个显式版本更简单。

    【讨论】:

      【解决方案3】:

      由于 Java 8 我建议以下解决方案:

      public static String printAll() {
          return Stream.of(GeneralInformation.values()).
                      map(GeneralInformation::name).
                      collect(Collectors.joining(", "));
      }
      

      【讨论】:

      • 在这个函数中,我们如何传递GeneralInformation作为参数?
      【解决方案4】:

      在应用程序中,将数据与表示分开是一种很好的做法。它允许数据在不同的用户界面中使用,它使数据对象更轻量级,它为internationalization 的未来提供了可能性。

      考虑到这一点,最好避免将显示名称与枚举常量强耦合。幸运的是,有一个类可以让这变得简单:EnumMap。

      public class ApplicationUI {
          private final Map<GeneralInformation, String> 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);
          }
      }
      

      【讨论】:

        【解决方案5】:

        如果您仍在使用 Java 1.7,这对我有用:

        String genInfoValues = "";
        boolean firstRun = true;
        for (generalInformation info : generalInformation.values()){
            if (firstRun) {
                firstRun = false;
                genInfoValues += info.name();
            } else {
                genInfoValues += ", " + info.name();
            }
        }
        

        【讨论】:

          【解决方案6】:
          枚举上的

          values() 返回一个数组。因此,执行以下操作很简单:

          System.out.println(Arrays.toString(generalInformation.values()));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-17
            • 2015-03-17
            • 1970-01-01
            • 2021-04-17
            相关资源
            最近更新 更多