我有一个用例,其中的一个类存在于2个版本的软件包中。
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
}
}
我相信我可以在构造函数this.selectedClass.example();
中传递实例时MyClass
调用,但是然后我将通过实例对象调用静态方法,不是很好吗?
另一方面,在上面的示例中,selectedClass
是一个Class对象,因此我不能example
像上面那样调用静态方法。
这是否意味着我应该使用反射?喜欢selectedClass.getMethod(name, parameterTypes)
。对我来说看起来太复杂了。
还是有更好的设计?
@javadev是正确的。使用反射几乎总是一个非常糟糕的主意。过度复杂的是它。
这里不需要反思。在实例上调用静态方法的能力很快被认为是设计错误。如此之多,以至于随后出现了高度不正交的设计选择,因为它不适用于作为接口成员的静态方法。
一种简单的解决方案是将静态方法移动到无状态对象的实例方法。否Class
,或其他必要的反思。这是策略设计模式的一种应用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句