将类作为参数传递给方法,然后调用静态方法

Posted

技术标签:

【中文标题】将类作为参数传递给方法,然后调用静态方法【英文标题】:Passing a class as argument to a method, then calling static methods 【发布时间】:2021-04-23 18:13:44 【问题描述】:

我有一个用例,其中一个类存在于一个包的 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
               


如果我在构造函数中传递MyClass 的实例,我相信我可以调用this.selectedClass.example();,但是我会通过实例对象调用静态方法,不是很好吗?

另一方面,在上面的例子中selectedClass是一个Class对象,所以我不能像上面那样调用静态方法example

这是否意味着我应该使用反射?喜欢selectedClass.getMethod(name, parameterTypes)。 对我来说看起来过于复杂。

或者有更好的设计吗?

【问题讨论】:

"这是否意味着我应该使用反射?"是的,它确实。如果你想使用 Class 对象,别无他法。 你会使用函数式编程吗?可以只要求一个供应商 您的应用程序的整个架构非常不清楚,因此不可能给您“正确答案”。根据您提供的内容,我相信您可能已经为您的问题提出了一个不太好的解决方案。根据我所见,我建议您看一下命令模式。如果这对您没有进一步帮助,请向我们提供更多信息。可能是指向您项目的“最低限度”或项目本身的链接。 只用一个好的旧开关:switch (name) case "packageV1.MyClass" -&gt; packageV1.MyClass.example(); case "packageV2.MyClass" -&gt; packageV2.MyClass.exampe(); 【参考方案1】:

以这种方式使用静态方法不是一个好的设计,也不符合面向对象的原则。

我的建议是尝试将“example()”更改为常规方法,而不是静态方法。

【讨论】:

【参考方案2】:

@javadev 是对的。使用反射几乎总是一个非常糟糕的主意。这是过于复杂的事情。

这里不需要反思。在实例上调用静态方法的能力很快就被认为是设计错误。如此之多以至于随后出现了高度非正交的设计选择,因为它不适用于作为接口成员的静态方法。

简单的解决方案是将静态方法移动到无状态对象的实例方法中。不需要Class 或其他反思。这是策略设计模式的一个应用。

【讨论】:

以上是关于将类作为参数传递给方法,然后调用静态方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将类方法作为参数传递给该类外部的函数?

如何将参数传递给静态类构造函数?

我可以将类引用作为参数传递给 VB Net 中的函数吗?

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

使用on()jQuery方法将'this'作为参数传递给事件处理程序

Python中的类方法实例方法静态方法