如何在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 ?

输出:

名称
教育
电子邮件
手机

  • 如何在另一个函数中传递该枚举generalInformation作为参数?
  • System.out.println(java.util.Arrays.asList(generalInformation.values()));
    

    你的第二部分…与interfaceclass相同

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

    现在,要打印所有enum值,只需使用如下命令:

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

    如果你还在使用Java 1.7,这是对我有用的:

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

    values()在enum上返回一个数组。因此,可以简单地执行以下操作:

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

    相关内容

    • 没有找到相关文章

    最新更新