如何在java的方法中将枚举作为参数传递?

2022-09-01 03:49:31
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()));
}

答案 1

请注意,您的问题混淆了两个不同的问题:将枚举传递给函数或将枚举常量传递给函数。我的理解是,你想将枚举本身传递给函数,而不是一个常量。如果不是:请参考Narendra Pathai关于如何将单个枚举常量传递给函数的答案。如果您不知道枚举和枚举常量之间的区别是什么,请查看有关枚举的文档...

我知道你想要的是有一个print(或任何其他)函数,你可以传递任何可能的枚举,打印枚举的每个可能值(即常量)。我发现以下两种方法可以做到这一点:

假设我们有以下枚举:

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

变体 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> aEnum)
{
    // retreive all constants of your enum (reflection!!)
    System.out.println(java.util.Arrays.asList(aEnum.getEnumConstants()));
}

在我看来,最好使用变体 1,因为在变体 2 中过度使用反射。变体 2 给你的唯一优点是,你的函数中有枚举本身的 Class 对象(静态枚举,不仅仅是常量),所以我提到了它以保持完整性。


答案 2

枚举是一个类。因此,您可以传递类的实例(例如),也可以传递类本身(例如)。EnumValues.generalInformation.PHONEEnumValues.generalInformation.class

如果要列出枚举类的所有实例,则需要传递枚举类,并使用例如。EnumSet.allOf(EnumValues.generalInformation.class)

您的困惑主要来自您不尊重Java命名约定的事实。ENums是类,应以大写字母开头(例如)。另一个混淆的来源是名称的错误选择。JAVA不是课程列表。这是一门课程。因此,枚举应命名为 。GeneralInformationCourse