确定在执行时实例哪个子类

我有一个带有一些子类的
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;
    }
有更好的解决方案吗? 谢谢。
已邀请:
我可以做很多if-else语句来查找要调用的子类构造函数,但是它不容易扩展。 一种替代方法是为您的“ 0”类创建一个“工厂对象”接口,然后使用工厂实例填充地图以创建每个子类。
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)可能会提供更优雅的解决方案。
我认为您正在寻找的是对象序列化 (该页面上的广告有些繁重,但是它有一些不错的信息。Google搜索“ java对象序列化”会返回很多信息) Oracle教程在这里:http://java.sun.com/developer/technicalArticles/Programming/serialization/
是的,还有另一种选择-对象关系映射(ORM),它可以为您完成此操作-除此之外,还有其他更多功能。 Java的ORM框架包括Hibernate和DataNucleus。

要回复问题请先登录注册