您可以使用单一方法myMethod编写界面MyInterface。然后,对于要作为有限集的一部分的每种类型,请编写一个包装类,如下所示:
class Wrapper1 implements MyInterface {
private final Type1 type1;
Wrapper1(Type1 type1) {
this.type1 = type1;
}
@Override
public void myMethod() {
type1.method1();
}
}
那么你只需要使用一个MyInterface而不是一组有限的类型,并且适当类型的适当方法将始终被调用。
请注意,要实际使用这些包装类来调用myMethod方法,您必须编写
myMethod(new Wrapper1(type1));
这将会变得有点丑陋,因为您将不得不记住该集合中每种类型的包装类的名称。因此,您可能希望将MyInterface替换为带有几个静态工厂的抽象类,从而生成包装器类型。喜欢这个:
abstract class MyWrapper {
static MyWrapper of(Type1 type1) {
return new Wrapper1(type1);
}
static MyWrapper of(Type2 type2) {
return new Wrapper2(type2);
}
abstract void myMethod();
}
那么您可以使用代码调用该方法
myMethod(MyWrapper.of(type1));
这种方法的优点是代码是一样的,无论你使用哪种类型。如果您使用此方法,则必须使用扩展名MyWrapper在Wrapper1声明中替换实现MyInterface。