确定在执行时实例的子类

时间:2011-04-18 22:19:36

标签: java reflection subclass

我有一个带有一些子类的Forum类,我将子类名称作为字符串字段存储在所有其他字段的数据库中。当我检索对象时,我希望它是同一个类的实例。我可以做很多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 个答案:

答案 0 :(得分:1)

  

我可以做很多if-else语句来查找要调用的子类构造函数,但它不容易扩展。

一种替代方法是为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)可能会提供更优雅的解决方案。

答案 1 :(得分:0)

我认为你要找的是Object Serialization

(那个页面有点广告,但它有一些很好的信息。谷歌搜索“java对象序列化”将返回大量的信息)

Oracle教程在这里:http://java.sun.com/developer/technicalArticles/Programming/serialization/

答案 2 :(得分:0)

是的,还有另一种选择 - 对象关系映射(ORM),它可以为您完成此操作 - 此外还有更多功能。 Java的ORM框架包括Hibernate和DataNucleus。