Java,类类型列表

时间:2012-02-25 19:04:17

标签: java list class inheritance

我正在研究一个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对象作为构造函数来创建给定类的实例是否可能?

3 个答案:

答案 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构造函数。