38
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()));
}
4

7 回答 7

19

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

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

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

于 2013-01-19T12:55:01.410 回答
19

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

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

假设我们有以下枚举:

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

变体 1:将常量数组从您的枚举传递给您的函数;由于枚举的常量是静态值,它们可以很容易地访问并传递给您的“打印”函数,如下所示:

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

在我看来,最好使用 variante 1,因为在 variante 2 中过度使用反射。variante 2 给您的唯一优势是您拥有 Enum 本身的 Class 对象(静态枚举,不仅是常量)在你的函数内部,所以我已经提到它的完整性。

于 2016-10-16T01:31:45.537 回答
16

如果你想从枚举中传递一个值

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

否则,如果您希望通过整个班级,因为从问题中不清楚

private static void print(Class<?> generalInfo){

    }

    public static void main(String[] args) {
        print(GeneralInformation.class);
    }
于 2013-01-19T12:50:22.917 回答
3

TestEnumMain.java:

package enumSample;

import org.apache.commons.lang3.EnumUtils; 

    public static void main(String[] args) {
        boolean result= isValidEnum(DummyEnum.class, "APPLE"); 
        System.out.println("result= " + result); 
        boolean result2= isValidEnum2(DummyEnum.class, "COF"); 
        System.out.println("result2= " + result2); 
        //boolean result3= isValidEnum2(A_Different_Enum.class, "COF");  //works
        //System.out.println("result3= " + result3); 

    }

    public static<E extends Enum<E>> boolean isValidEnum2(Class<E> enumClass, String enumName) {

        System.out.println("enumClass.getEnumConstants().length= " + enumClass.getEnumConstants().length); 
        System.out.println("enumClass.getEnumConstants()[0]= " + enumClass.getEnumConstants()[0]); 
        System.out.println("enumClass.getEnumConstants()[1]= " + enumClass.getEnumConstants()[1].name()); 
        System.out.println("enumName.valueOf(enumClass)= "+ enumName.valueOf(enumClass));

        if(enumName== null) {
            return false; 
        } else {
            try {
                if(enumClass.isAssignableFrom(DummyEnum.class)) { /*Checks if enumClass is an instance of DummyEnum.class*/
                    for (int i=0; i!= enumClass.getEnumConstants().length; i++) {
                        System.out.println("(DummyEnum) enumClass.getEnumConstants()["+i+"]).code()= "+ ((DummyEnum) enumClass.getEnumConstants()[i]).code());          
                        if(enumName.equals(((DummyEnum) enumClass.getEnumConstants()[i]).code())) {
                            return true; 
                        }
                    }                   
                    return false; 
                } else {
                    Enum.valueOf(enumClass, enumName); 
                    return true; 
                }
            } catch (IllegalArgumentException var3){
                return false; 
            }
        }

    }

    //Original Method from apache.commons.long3.EnumUtils: 
    public static<E extends Enum<E>> boolean isValidEnum(Class<E> enumClass, String enumName) {
        if(enumName== null) {
            return false; 
        } else {
            try {
                Enum.valueOf(enumClass, enumName); 
                return true; 
            } catch (IllegalArgumentException var3){
                return false; 
            }
        }
    }
}

虚拟枚举.java:

package enumSample;

public enum DummyEnum {
    APPLE("APP"), 
    GOOGLE("GOOG"), 
    CAPITAL_ONE("COF");

    private String code; 
    DummyEnum(String code) {this.code= code;}
    public String code() {return code;}
}
于 2018-06-01T20:56:17.847 回答
1

printEnumValue(EnumValues.generalInformation.NAME,EnumValues.generalInformation.AGE,EnumValues.generalInformation.PHONE);
接收:

public static void printEnumValue(EnumValues.generalInformation en){
System.out.println(en.toString());
}
于 2013-01-19T12:54:33.190 回答
0

枚举就像类型一样使用:

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

像这样使用:

printEnumValue(courseList.JAVA);

于 2013-01-19T12:54:29.293 回答
0

枚举在技术上是 Enum 类的后代。因此,如果您只想在方法中使用 Enum 的标准方法(例如 values()),请像这样传递参数: static void printEnumValue(Enum generalInformation) 看,您唯一需要更改的是大写字母 E。

于 2021-07-02T09:45:04.783 回答