使用反射动态调用正确的正确设置方法

基思

我正在使用一个无法修改的库,该库具有包含以下内容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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章