如何在java中打印所有枚举值?

Ree*_*nda 17 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";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我有这些信息可用于枚举.

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

那输出:

姓名
教育
电邮
电话

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

Ste*_*lly 27

System.out.println(java.util.Arrays.asList(generalInformation.values()));
Run Code Online (Sandbox Code Playgroud)

你的第二部分...... interface和a或a一样class


Jon*_*eet 14

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

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

// Note: enum name changed to comply with Java naming conventions
for (GeneralInformation info : EnumSet.allOf(GeneralInformation.class)) {
    System.out.println(info);
}
Run Code Online (Sandbox Code Playgroud)

使用的替代方法EnumSet是使用GeneralInformation.values(),但这意味着每次调用时都必须创建一个新数组,这对我来说是浪费.诚然调用EnumSet.allOf需要一个新的对象,每次过......如果你这样做是一个很大和关心的性能,你总是可以它缓存起来.

在参数方面,您可以GeneralInformation像任何其他类型一样使用:

public void doSomething(GeneralInformation info) {
    // Whatever
}
Run Code Online (Sandbox Code Playgroud)

用一个值调用,例如

doSomething(GeneralInformation.PHONE);
Run Code Online (Sandbox Code Playgroud)

使用构造函数参数进行重构

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

Java 8 开始,我建议使用以下解决方案:

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