簡體   English   中英

如何將enum作為參數傳遞給java中的方法?

[英]How to pass enum as an argument in a method in 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()));
}

枚舉是一個類。 所以你可以傳遞一個類的實例(例如EnumValues.generalInformation.PHONE ),或者你可以傳遞類本身(例如EnumValues.generalInformation.class )。

如果要列出枚舉類的所有實例,則需要傳遞枚舉類,並使用EnumSet.allOf(EnumValues.generalInformation.class)作為示例。

您的困惑主要來自於您不尊重Java命名約定。 枚舉是類,應該以大寫字母開頭(例如, 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);
    }
}

否則,如果你想要通過整個班級,因為從問題中不清楚

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

    }

    public static void main(String[] args) {
        print(GeneralInformation.class);
    }

請注意,您的問題混淆了兩個不同的問題:將枚舉傳遞給函數或將枚舉常量傳遞給函數。 我的理解是你想要傳遞枚舉本身,而不是它的一個常量函數。 如果不是:請參閱Narendra Pathai關於如何將單個枚舉常量傳遞給函數的答案。 如果您不知道枚舉和枚舉常量之間的區別是什么,請查看有關枚舉的文檔 ...

我明白你想要的是有一個打印(或任何其他)函數,你可以傳遞任何可能的枚舉,打印每個枚舉的可能值(即常量)。 我發現以下兩種方法可以做到這一點:

讓我們說我們有以下枚舉:

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

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

Variante 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中反射的過度使用.Viriante 2給你的唯一優點是你有Enum本身的Class對象(靜態枚舉,不僅是它的常量)在你的功能中,所以我已經提到了它的完整性。

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

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

La claseenumsería

public enum LdapExceptionEnumeration {

    LDAP_ATTR_NAME_CREATE_INVALIDO("3018","El nombre del atributo enviado es inválido")
String codigo;
    String error;

    private LdapExceptionEnumeration(String codigo, String error) {
        this.codigo = codigo;
        this.error = error;
    }

    public String getCodigo() {
        return codigo;
    }

    public String getError() {
        return error;
    }

}

Este seria el junitest para la prueba

public class EnumTest {
 @Test
 public void consultaenum(){

     imprimeEnum(LdapExceptionEnumeration.LDAP_ATTR_NAME_CREATE_INVALIDO);

 }
public void imprimeEnum(LdapExceptionEnumeration enumClass){
     System.out.println("codigo: "+ enumClass.getCodigo());
     System.out.println("mensaje: "+ enumClass.getError());
 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM