Как печатать все значение enum в 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";
        }
    }
}

У меня есть эта информация доступна в перечислении.

  • Как распечатать все значения перечисления, такие как: print.generalInformation?

Это выводит:

Название
Образование
Email
Телефон

  1. Как передать это перечисление generalInformation как arg в другой функции?

Ответ 1

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

Ваша вторая часть... Точно так же, как interface или class

Ответ 2

Во-первых, я бы реорганизовал ваше перечисление, чтобы передать строковое представление в параметре конструктора. Этот код находится внизу.

Теперь, чтобы напечатать все значения перечисления, вы просто используете что-то вроде:

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

С вашими текущими значениями вы фактически можете просто преобразовать имя в заголовок автоматически, но это не будет очень гибким в долгосрочной перспективе, и я думаю, что эта явная версия проще.

Ответ 3

Так как Java 8, я бы предложил следующее решение:

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

Ответ 4

В приложениях хорошей практикой является разделение данных из презентации. Он позволяет использовать данные в разных пользовательских интерфейсах, что делает объекты данных более легкими и позволяет использовать возможность интернационализации.

Имея это в виду, хорошо избегать сильной связи отображаемого имени с константой 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);
    }
}

Ответ 5

Если вы все еще на Java 1.7, это то, что сработало для меня:

String genInfoValues = "";
boolean firstRun = true;
for (generalInformation info : generalInformation.values()){
    if (firstRun) {
        firstRun = false;
        genInfoValues += info.name();
    } else {
        genInfoValues += ", " + info.name();
    }
}

Ответ 6

values () в перечислении возвращает массив. Таким образом, было бы просто сделать следующее:

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