将类作为参数传递给方法,然后调用静态方法
我有一个使用案例,其中一个类存在于包的两个版本中。
package packageV1;
public class MyClass extends BaseClass{
public static String example(){
return "Version1";
}
}
package packageV2;
public class MyClass extends BaseClass{
public static String example(){
return "Version2";
}
}
到目前为止(我相信)还不错。
然后,我有一个使用该类的应用程序,为了避免为不同的包版本重写应用程序,我希望将应该使用的类(即,用于感兴趣的包)作为参数传递给该应用程序。 所以类似于public class Application{
private Class<BaseClass> selectedClass;
public void Application(Class<BaseClass> selectedClass){
this.selectedClass = selectedClass;
this.selectedClass.example(); // not possible
}
}
我相信如果我在构造函数中传递MyClass
的实例,我可以调用this.selectedClass.example();
,但然后我会通过实例对象调用静态方法,这不是很好吗?
另一方面,在上面的示例中,selectedClass
是一个Class对象,所以我不能像上面那样调用静态方法example
。
这是否意味着我应该使用反射?如selectedClass.getMethod(name, parameterTypes)
。
在我看来太复杂了。
还是有更好的设计?
解决方案
@javadev是对的。使用反射几乎总是一个非常糟糕的主意。这是一个过于复杂的问题。
这里不需要反思。在实例上调用静态方法的能力很快被意识到是一个设计错误。以至于有了后续的高度非正交性设计选择,因为它不适用于作为接口成员的静态方法。
简单的解决方案是将静态方法移动到无状态对象的实例方法。不需要Class
或其他反射。这是策略设计模式的应用。
相关文章