Ответ 1
System.out.println(java.util.Arrays.asList(generalInformation.values()));
Ваша вторая часть... Точно так же, как interface
или class
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
как arg в другой функции?System.out.println(java.util.Arrays.asList(generalInformation.values()));
Ваша вторая часть... Точно так же, как interface
или class
Во-первых, я бы реорганизовал ваше перечисление, чтобы передать строковое представление в параметре конструктора. Этот код находится внизу.
Теперь, чтобы напечатать все значения перечисления, вы просто используете что-то вроде:
// 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(", "));
}
В приложениях хорошей практикой является разделение данных из презентации. Он позволяет использовать данные в разных пользовательских интерфейсах, что делает объекты данных более легкими и позволяет использовать возможность интернационализации.
Имея это в виду, хорошо избегать сильной связи отображаемого имени с константой enum. К счастью, есть класс, который делает это проще: 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 () в перечислении возвращает массив. Таким образом, было бы просто сделать следующее:
System.out.println(Arrays.toString(generalInformation.values()));