Решение, какой подкласс для экземпляра во время выполнения - PullRequest
1 голос
/ 19 апреля 2011

У меня есть класс Forum с некоторыми подклассами, и я сохраняю имя подкласса как поле String в базе данных вместе со всеми другими полями.Когда я получаю объект, я хочу, чтобы он был экземпляром того же класса, что и был.Я мог бы сделать много операторов if-else, чтобы найти, какой конструктор подкласса вызывать, но это было бы нелегко расширить.

Я нашел это решение, но оно кажется каким-то грязным:

    public static Forum createForum(int forumId, String kind) {
         try {
           Class cls = Class.forName("forum."+kind);
           Constructor ct = cls.getConstructor(Integer.TYPE, String.class);
           Object retobj = ct.newInstance(forumId, kind);
           return (Forum) retobj;
         }
         catch (Throwable e) {
            System.err.println(e);
         }
         return null;
    }

Есть ли лучшее решение?

Спасибо.

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

Я мог бы сделать много операторов if-else, чтобы найти, какой конструктор подкласса вызывать, но его было бы нелегко расширить.

Одна альтернатива - создать "фабрику"object "интерфейс для ваших Forum классов, а затем заполните карту фабричными экземплярами, чтобы создать каждый из подклассов.

public interface ForumFactory {
    public Forum createForum(String arg);
}

public class FooForumFactory implements ForumFactory {
    public Forum createForum(String arg) { return new FooForum(arg); }
}

Map<String, ForumFactory> factories = new HashMap<String, ForumFactory>();
factories.put("foo", new FooForumFactory());
factories.put("bar", new BarForumFactory());

...

// Create an instance ...
Forum forum = factories.get(forumType).createForum(forumName);

Вещи были бы более сложными, если бы разные конструкторы подклассов требовали разных аргументов.Но это также будет проблематичным для вашего рефлексивного решения.

В долгосрочной перспективе использование ORM (например, Hibernate) может дать более элегантное решение.

0 голосов
/ 19 апреля 2011

Да, есть альтернатива - Object-Relational Mapping (ORM), которая делает это для вас - и многое другое.Платформы ORM для Java включают Hibernate и DataNucleus.

0 голосов
/ 19 апреля 2011

Я думаю, что вам нужно: Сериализация объектов

(Эта страница немного рекламная, но содержит полезную информацию. Поиск в Google "сериализации Java-объектов" вернетсямного информации)

Учебник Oracle здесь: http://java.sun.com/developer/technicalArticles/Programming/serialization/

...