2010-06-09 17 views
6

Powiedzmy mam prosty Enum nazywane Animal zdefiniowany jako:Jak "valueOf" enum z nazwą klasy?

public enum Animal { 
    CAT, DOG 
} 

i mam metody takie jak:

private static Object valueOf(String value, Class<?> classType) { 
    if (classType == String.class) { 
     return value; 
    } 

    if (classType == Integer.class) { 
     return Integer.parseInt(value); 
    } 

    if (classType == Long.class) { 
     return Long.parseLong(value); 
    } 

    if (classType == Boolean.class) { 
     return Boolean.parseBoolean(value); 
    } 

    // Enum resolution here 

}

Co mogę umieścić wewnątrz tej metody do zwracania wystąpienie mojego wyliczenia, gdzie wartość jest typu classType?

Mam spojrzał na starając:

if (classType == Enum.class) { 
     return Enum.valueOf((Class<Enum>)classType, value); 
    } 

Ale to nie działa.

Odpowiedz

8

Twoja classType nie jest Enum, to jest Animal. Aby działać, powinien działać

if (classType.isEnum()) { 
    return Enum.valueOf(classType, value); 
} 

. Dodatkowo, aby porównać instancje klasy, należy użyć wartości equals(), a nie == (chociaż w praktyce będzie działał ==, jeśli w pobliżu jest tylko jeden moduł ładujący klasy).

+2

Ale klasa nie zastępuje equals(), więc myślę, że equals() nie będzie działać, jeśli istnieje wiele programów ładujących klasy. – waxwing

+1

Umm, myślę, że masz rację. Właściwie to nie wiem, jak wiele programów ładujących klasy współpracuje ze sobą, ani czy jest prawdopodobne (a nawet możliwe), że istnieje wiele instancji tego samego obiektu klasy. Być może można też użyć 'Class # isAssignableFrom()'. To powiedziawszy, używanie 'equals()' jest prawie błędne. –

Powiązane problemy