23
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作为参数传递给另一个函数?
4

6 回答 6

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

您的第二部分...与 aninterface或 a相同class

于 2013-01-19T10:56:51.620 回答
15

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

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

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

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

于 2013-01-19T10:55:41.553 回答
5

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

public static String printAll() {
    return Stream.of(GeneralInformation.values()).
                map(GeneralInformation::name).
                collect(Collectors.joining(", "));
}
于 2016-11-10T02:49:41.930 回答
0

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

考虑到这一点,最好避免将显示名称与枚举常量强耦合。幸运的是,有一个类使这变得简单: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);
    }
}
于 2013-01-19T12:42:41.163 回答
0

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

String genInfoValues = "";
boolean firstRun = true;
for (generalInformation info : generalInformation.values()){
    if (firstRun) {
        firstRun = false;
        genInfoValues += info.name();
    } else {
        genInfoValues += ", " + info.name();
    }
}
于 2017-06-26T18:31:11.340 回答
0

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

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

于 2019-09-23T17:56:32.133 回答