我有一个带有一些子类的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;
}
有没有更好的解决方案?
感谢。
答案 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。