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

27
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

输出结果为:

Name
Education
Email
Phone

  1. 如何将枚举类型 generalInformation 作为参数传递给另一个函数?

4
不必在每个枚举元素中重写toString方法。每个枚举都有一个名为name()的方法,它返回调用此方法的元素的字符串表示形式:“SomeEnum.VALUE.name()”将返回“VALUE”字符串。您只需在主要的toString()方法中使用return name().charAt(0)+name().substring(1).toLowerCase();,就像这里的示例一样http://ideone.com/IraxgB。 - Pshemo
6个回答

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

你的第二部分... 就像一个接口或者一样


15

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

现在,要打印所有枚举值,您只需使用类似以下的代码:

// Note: enum name changed to comply with Java naming conventions
for (GeneralInformation info : EnumSet.allOf(GeneralInformation.class)) {
    System.out.println(info);
}
< p >使用EnumSet的替代方案是使用GeneralInformation.values(),但这意味着每次调用它都必须创建一个新数组,这让我感觉很浪费。诚然,每次调用EnumSet.allOf也需要一个新的对象...如果您需要频繁进行此操作并且担心性能问题,您可以随时在某个地方缓存它。< /p >

当涉及参数时,您可以像处理其他任何类型一样使用GeneralInformation:< /p >

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

基于你当前的数值,你其实可以自动将名称转换为标题格式 - 但这并不利于长期的灵活性,我认为这种显式的方法更简单。


5

自从Java 8以后,我建议采用以下解决方案:

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

在这个函数中,我们如何将“GeneralInformation”作为参数传递? - zeal

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

0
在应用程序中,将数据与展示分离是一个好的实践。这样可以使数据在不同的用户界面中使用,使数据对象更加轻量化,并为未来的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);
    }
}

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接