2016-03-10 3 views
-1

У меня есть 3 класса Foo1, Foo2 и Foo3, а Объект может быть любым из трех типов. Случайному объекту присваивается мне поле с указанием типа. Так как:Java Использование перечислений для определения типа класса

{ 
    type: foo1 
} 

Теперь я могу читать это значение в очень хорошо, и у меня есть класс перечисление следующим образом:

public enum ObjectType { 
    FOO1, 
    FOO2, 
    FOO3; 
} 

Я хочу, чтобы иметь возможность определить тип объекта из соответствующего значения перечислений , Итак, как мне связать значения перечисления с соответствующими классами, чтобы при чтении значения type я могу определить, имеет ли объект тип Foo1, Foo2 или Foo3.

+0

Ues 'instanceof' для определения типа – NullPointerException

+0

' Enum.valueOf'? – Jerry06

+0

@NullPointerException Как именно? Я разбираю ответ JSON, который содержит поле типа. Таким образом, у меня нет объекта из get go, чтобы использовать 'instanceof' – Richard

ответ

1

Что-то вроде этого (вы можете изменить свой код, только метод get(String jsonType), чтобы получить Class непосредственно без получения Enum и то класс)

public static enum FooClassEnum 
{ 
    Foo1("foo1", FOO1.class), 
    Foo2("foo2", FOO2.class), 
    Foo3("foo3", FOO3.class); 

    private final Class myClass; 
    private final String jsonType; 

    FooClassEnum(String jsonType, Class myClass){ 
     this.myClass = myClass; 
     this.jsonType = jsonType; 
    } 

    public static FooClassEnum get(String jsonType) { 
     for (FooClassEnum ft : values()) 
      if (ft.getJsonType().equals(jsonType)) 
       return ft; 
     return null; 
    } 

    public Class getFooClass() { 
     return myClass; 
    } 

    public String getJsonType() { 
     return jsonType; 
    } 
} 

использование будет выглядеть следующим образом, предполагая, что тип в вашем JSON является foo1:

FooClassEnum classEnum = FooClassEnum.get("foo1"); 
Class classOfYourJson = classEnum.getFooClass(); 
//Cast your object 
Object yourObj; 
if(classOfYourJson.newInstance() instanceof Foo1) { 
    Foo1 f1 = (Foo1) yourObj; 
} else if(classOfYourJson.newInstance() instanceof Foo2) { 
    Foo2 f2 = (Foo2) yourObj; 
} else if(classOfYourJson.newInstance() instanceof Foo3) { 
    Foo3 f3 = (Foo3) yourObj; 
} else { 
    //error 
} 
+0

Я пробовал делать 'classEnum.getFooClass() instanceof Foo1', и я получаю ошибку' Error: (36, 54) java: несовместимые типы: java.lang.Class не может быть преобразован в .... Foo1' – Richard

+0

посмотреть на мой редактировать –

0

So how do I link the enum values to the corresponding classes so that when I read in the type value I can tell if the object is of type Foo1, Foo2, or Foo3.

Добавить Class поля в ObjectType перечисления, как этого

public enum ObjectType { 
    FOO1(Foo1.class), 
    FOO2(Foo2.class), 
    FOO3(Foo3.class); 

private Class klass; 

ObjectType(Class klass) { 
    this.klass = klass; 
} 
// ... klass getter 
} 
0

Один из способов с картой.

{ 
    // define and populate the map 
    public static final Map<ObjectType,Class> typeMap; 
    static { 
    Map<ObjectType,Class> tempMap = new Hashtable<ObjectType,Class>; 
    tempMap.add(ObjectType.FOO1,Foo1.class); 
    tempMap.add(ObjectType.FOO2,Foo2.class); 
    tempMap.add(ObjectType.FOO3,Foo3.class); 
    typeMap = Collections.unmodifiableMap(tempMap); 
    } 

    // use it 
    { 
    // actually you probably want a superclass of Foo{1,2,3} ... 
    Object newObj = typeMap.get(tempObj.type.toUpperCase()).newInstance(); 
    newObj.initalizeFrom(tempObj); 

Однако я не уверен, что вам нужно перечислить. Если поле «type» действительно является именем класса, вы можете напрямую отразить его.

{ 
    // ... 
    newObj = Class.forName(tempObj.type).newInstance(); 

Или вы можете сделать другие преобразования с подходящим стандартом именования.

{ 
    // ... 
    newObj = Class.forName(PACKAGE + "." 
    + StringUtils.capitalize(tempObj.type)).newInstance(); 
Смежные вопросы