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";
}
}
}
我知道枚举中有可用的信息。
- 如何打印所有枚举值,如:
print.generalInformation
?
输出:
名称
教育
电子邮件
手机
- 如何在另一个函数中传递该枚举
generalInformation
作为参数?
System.out.println(java.util.Arrays.asList(generalInformation.values()));
你的第二部分…与interface
或class
相同
首先,我将重构枚举,以便在构造函数参数中传递字符串表示形式。代码在底部
现在,要打印所有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 ())),