如何允许用户选择要初始化的类

时间:2016-11-25 17:06:18

标签: java

我有一个abstract class Foo,其中包含一个函数a(Object o) 根据您使用的Foo的实施情况,a(Object o)的实施方式略有不同。

我希望程序的用户能够确定使用Foo的实现(例如,aFoobFoocFoo等),但是我希望减少对条件逻辑的使用,以便将来可以更安全地添加到我的程序中。

我目前有一个Enum eBar,其中包含用户可以选择的Foo的所有实现的名称,但我无法确定如何使用它来初始化该类。< / p>

2 个答案:

答案 0 :(得分:4)

在每个枚举实例中存储要使用的Foo实例,或添加一个创建Foo的方法:

public enum FooType {
    A {
        @Override
        public Foo createFoo() {
            return new AFoo();
        }
    },
    B {
        @Override
        public Foo createFoo() {
            return new BFoo();
        }
    }

    public abstract Foo createFoo();
}

然后,一旦用户选择了类型,您需要做的就是

selectedFooType.createFoo().a(object);

答案 1 :(得分:3)

[编辑]您可以使用下面的Enum来实现这一目标

 public enum FooType {

       FOO_A(aFoo::new),
       FOO_B(bFoo::new),
       FOO_C(cFoo::new);
      //add as much as you want here

       private final Supplier<Foo> fooSupp; //the aim of using a supplier is to create a new instance each time you call the create method as mentioned in the comment.

       FooType(final Supplier<Foo> fooSupp) {
          this.fooSupp = fooSupp;
       }

       public final Foo create(){
         return this.fooSupp.get();
       }
}

然后你可以像这样使用它

final Foo myFoo = FooType.FOO_A.create();
myFoo.o(Object);