我正在研究一个java应用程序。它是一个抽象类Model和2个派生类Model 1和Model 2. Model1和Model2的行为不同,所以我想允许用户从两个中选择一个模型。 它可以实现如下:
Model model;
If(response==1){
model = new Model1();
}else if(response==2){
model = new Model2();
}
现在问题是,如果我添加一个新类Model3,我必须重写代码。 我可以创建一个List,在那里我将从每个类添加一个实例,然后我会添加一个静态方法,它将返回一个新的类实例,但我希望它可以用更多样式来完成。
是否可以创建一个List,以保存每个类的类型。从这个List我可以创建一个菜单来选择一个模型,然后使用该类型来创建用户需要的类。
那么创建List<Class>
,然后使用Class对象作为构造函数来创建给定类的实例是否可能?
答案 0 :(得分:4)
您可以创建suppliers的列表:
static final List<Supplier<Model>> MODEL_MAKERS = ImmutableList.of(
new Supplier<Model>() { public Model get() { return new Model1(); } },
new Supplier<Model>() { public Model get() { return new Model2(); } },
new Supplier<Model>() { public Model get() { return new Model3(); } }
);
你可以用反射来解决问题,但是这需要在Java的正常异常处理机制之外步进,需要零参数public
构造函数和public
类,这些类限制了代码在维护中如何以不同的方式发生变化由javac
检查,在这种情况下没有必要。
答案 1 :(得分:1)
如果你确定它有一个公共的no-args构造函数,你可以使用Class.newInstance()
对于更复杂的用途,您可以找到Constructor Class.getConstructor(s)对象,然后以这种方式调用它。
完成后,将Class
es粘贴到Map
或其他东西进行查找和创建实例相对容易。
答案 2 :(得分:0)
是的,您可以使用Class上的newInstance()方法构建一个。它必须有一个no-args构造函数。