【问题标题】:How to pass enum as an argument in a method in java?java - 如何在java中的方法中将枚举作为参数传递?
【发布时间】:2013-01-19 12:48:03
【问题描述】:
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()));
}

【问题讨论】:

    标签: java enums


    【解决方案1】:

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

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

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

    【讨论】:

    • 这只是在另一端给了我一个空枚举实例
    • 你将如何设计一个可以通过传递任何枚举来调用的方法?
    【解决方案2】:

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

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

    假设我们有以下枚举:

    // 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 对象(静态枚举,不仅它是常量)在你的函数中,所以我已经提到它的完整性。

    【讨论】:

    • 感谢这个答案对我有帮助。
    【解决方案3】:

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

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

    【讨论】:

    • 因为枚举就像任何其他类一样,你想要类文字吗?然后我编辑使用Class&lt;?&gt;
    • 或者,如果你想要枚举类的所有实例,那么使用GeneralInformation.values(),它将为你提供包含所有枚举实例的 GeneralInformation[]
    • 哇,很有用:cls.getEnumConstants() 返回“一个数组,其中包含按声明顺序由此 Class 对象表示的枚举类的值,如果为 null此 Class 对象不代表枚举类型”。测试了它。像魅力一样工作。
    【解决方案4】:

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

    DummyEnum.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;}
    }
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        枚举就像类型一样使用:

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

        类似:

        printEnumValue(courseList.JAVA);

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-21
            • 1970-01-01
            • 2010-09-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多