微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决确定在执行时实例哪个子类

我有一个带有一些子类的
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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。