Как передать enum в качестве аргумента в методе в java?

public class Enumvalues{
 enum courseList {
 JAVA,
 C,
 PYTHON,
 PERL
 }
 enum generalInformation {
 NAME,
 AGE,
 PHONE
 } 
 enum sex {
 MALE,
 FEMALE
 }
}
public static void main(String args[]) {
 printEnumValue(generalInformation); // how to pass enum in this block
}
static void printEnumValue(enum generalInformation) { // how to receive enum in this block 
 System.out.println(java.util.Arrays.asList(generalInformation.values()));
}
5 ответов

Перечисление - это класс. Таким образом, вы можете передать экземпляр класса (например, EnumValues.generalInformation.PHONE), или вы можете передать сам класс (EnumValues.generalInformation.class).

Если вы хотите перечислить все экземпляры класса enum, вам необходимо передать класс enum и использовать EnumSet.allOf(EnumValues.generalInformation.class), например.

Ваше замешательство в основном происходит из-за того, что вы не уважаете соглашения об именах Java. ENums являются классами и должны начинаться с буквы верхнего регистра (например, GeneralInformation). Другим источником путаницы является плохой выбор имен. JAVA - это не список курсов. Это курс. Поэтому перечисление должно быть названо Course.


Если вы хотите передать одно значение из перечисления

public class Test {
 enum GeneralInformation{
 NAME;
 }
 private static void print(GeneralInformation val){
 System.out.println(val);
 }
 public static void main(String[] args) {
 print(GeneralInformation.NAME);
 }
}

else, если вы хотите, чтобы весь класс был передан, как это было непонятно из вопроса

private static void print(Class<!--?--> generalInfo){
 }
 public static void main(String[] args) {
 print(GeneralInformation.class);
 }


Обратите внимание, что ваш вопрос перепутал две разные проблемы: Передача Enum для функции ИЛИ Передача константы Enum функции. Мое понимание заключалось в том, что вы хотите передать сам перечисление, а не одну из констант функции. Если нет: обратитесь к ответу Нарендра Патаи о том, как передать единственную константу перечисления в функцию. Если вы не знаете, какая разница между перечислением и константой enum, просмотрите docs об перечислениях...

Я понимаю, что вы хотите иметь функцию печати (или любую другую), где вы можете передать любое возможное перечисление, чтобы печатать каждое из возможных значений перечислимого типа (например, константы). Для этого я нашел следующие два подхода:

Допустим, у нас есть следующее перечисление:

// The test enum, any other will work too
public static enum ETest
{
 PRINT,MY,VALUES
}

Вариант 1: Передайте массив констант из вашего перечисления в вашу функцию; Поскольку константы перечисления являются статическими значениями, их можно легко получить и передать в вашу функцию "print" следующим образом:

public static void main(String[] args)
{
 // retreive all constants of your enum by YourEnum.values()
 // then pass them to your function
 printEnum(ETest.values());
}
// print function: type safe for Enum values
public static <t extends="" enum<t="">> void printEnum(T[] aValues)
{
 System.out.println(java.util.Arrays.asList(aValues));
}
</t>

Вариант 2: Передайте класс перечисления в качестве параметра функции. Это может выглядеть красивее, но имейте в виду, что отражение (производительность):

public static void main(String[] args)
{
 printEnum2(ETest.class);
}
// print function: accepts enum class and prints all constants
public static <t extends="" enum<t="">> void printEnum2(Class<t> *****)
{
 // retreive all constants of your enum (reflection!!)
 System.out.println(java.util.Arrays.asList(*****.getEnumConstants()));
}
</t></t>

На мой взгляд, лучше использовать вариант 1 из-за чрезмерного использования отражения в варианте 2. Единственное преимущество, которое дает вариант 2, заключается в том, что у вас есть объект класса самого Enum (статическое перечисление, не только это константы) внутри вашей функции, поэтому я упомянул об этом для полноты.


printEnumValue(EnumValues.generalInformation.NAME,EnumValues.generalInformation.AGE,EnumValues.generalInformation.PHONE); Прием:

public static void printEnumValue(EnumValues.generalInformation en){
System.out.println(en.toString());
}


Перечисление используется как тип:

static void printEnumValue(courseList generalInformation) { // how to receive enum in this block

используется как:

printEnumValue(courseList.JAVA);

licensed under cc by-sa 3.0 with attribution.