我正在使用一个无法修改的库,该库具有包含以下内容Enum
和设置方法的类。
public class MyClass {
public enum MyEnum {
ClassA,
ClassB,
ClassC
...
}
private SomeEnum myEnum;
private Interface ifc; // parent of ClassA, ClassB, ClassC, etc.
public ClassA setClassA(ClassA classA) {
ifc = classA;
myEnum= SomeEnum.ClassA;
}
public ClassB setClassB(ClassB classB) {
ifc = classB;
myEnum= SomeEnum.ClassB;
}
public ClassC setClassC(ClassC classC) {
ifc = classC;
myEnum= SomeEnum.ClassC;
}
// ... more of these setters
}
请注意,每个Enum
名称如何与实现的相应类名称的字符串文字匹配Interface
,以及每个类名称如何具有其自己的特定设置器。
如您所想,调用此代码的代码非常简单:
Interface ifc = someCallToGetAnImpl();
MyClass myClass = new MyClass();
myClass.set???(ifc);
这里有很多的实现Interface
,我不能保证图书馆的未来版本将不会增加更多。因此,我希望创建一个可以动态派生并调用正确的setter的函数。
我当然可以构建一个大的旧if... else if...
块,但是Interface
在构建的新实现时,这将需要更改软件。我还考虑过Class.getDeclaredMethod(String name, Class<?>... parameterTypes)
通过name
使用类似的东西来构建参数来研究使用
"set" + ifc.getClass.getSimpleName()...
那应该使软件保持动态,但是看起来很笨拙。
任何干净的,生产质量的建议或方法都将受到欢迎。
您正在考虑通过Class.getDeclaredMethod(String name,Class ... parameterTypes)之类的方法使用Reflection的方法是解决您所描述的问题的正确方法。这是一个难题,它值得采用难题的方法。
不过,我要补充的一件事是,您编写单元测试来验证您对该类中的模式的假设,这样,如果它们添加了不遵循该模式的方法,您就会收到警告。例如,如果添加了新的枚举值,但没有方法支持该值,该怎么办?您将希望自动收到类似警报。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句