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