Создавайте объекты динамически в Java - PullRequest
1 голос
/ 03 февраля 2011

Есть ли (лучший) способ динамически создавать объекты?

Сейчас я использую простое «фабричное решение», как показано ниже:

   String classType = generalObject.getClass().toString();

    if(classType.equals("class be.testApp.UserObject")) {
        return UserObject.fromByteArray(data);
//return new UserObject();
    }
    else if(classType.equals("class.be.testApp.NewsObject"))    {
        return NewsObject.fromByteArray(data);
//return new NewsObject();      
    }

Ответы [ 3 ]

6 голосов
/ 03 февраля 2011

Этот код не является фабричным шаблоном, и объект не создается.Вы оцениваете имя класса и вызываете статический метод для класса.


Теперь похоже, что у вас есть объект (generalObject) и вы хотите создать новый экземпляр того же типа. Если у всех возможных типов есть открытый конструктор по умолчанию (соглашение!), То вы можете использовать его для создания нового экземпляра на основе заданного объекта:

Object newObject = generalObject.getClass().newInstance();

(но, возможно, я все ещене понял твою идею ...)

1 голос
/ 03 февраля 2011

Вы можете использовать отражение здесь, что-то вроде

final Class<?> clazz = generalObject.getClass();
final Method method = clazz.getMethod("fromByteArray", data.getClass());
return method.invoke(null, data);

должно подойти.

0 голосов
/ 03 февраля 2011
String classType = generalObject.getClass().toString();
if(classType.equals("class be.testApp.UserObject")) {
    return UserObject.fromByteArray(data);
}else if(classType.equals("class.be.testApp.NewsObject"))    {
    return NewsObject.fromByteArray(data);
}

Это очень сложно. Поскольку оба класса находятся в вашем пути к классам компиляции, просто используйте объекты классов, а не их строковые представления:

Class<?> classType = generalObject.getClass();
if(UserObject.class.equals(classType)) {
    return UserObject.fromByteArray(data);
}else if(NewsObject.class.equals(classType)) {
    return NewsObject.fromByteArray(data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...