当前位置: 首页 > 知识库问答 >
问题:

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

党航
2023-03-14

我有一个用例,其中一个类存在于一个包的两个版本中。

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
               }

}

我相信我可以把这个叫做。selectedClass。示例()如果我在构造函数中传递MyClass的实例,那么我会通过实例对象调用静态方法,不是吗?

另一方面,在上面的示例中,selectedClass是一个类对象,因此我不能像上面那样调用静态方法example

这是否意味着我应该使用反射?喜欢selectedClass.get方法(名称,参数类型)。在我看来太复杂了。

还是有更好的设计?

共有2个答案

阳昊
2023-03-14

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

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

狄飞鹏
2023-03-14

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

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

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

 类似资料:
  • 我有静态方法在我的类 这就是定义 这里用的是 这是我得到的一个错误 E0167类型为“void(TV_DepthCamAgent::)(int count,int copied_file)”的参数与类型为“void()(int,int)”的参数不兼容 错误C3867“TV_DepthCamAgent::progress_callback”:非标准语法;使用' 我做错了什么?

  • 根据这个问题,一个函数可以作为参数传递给另一个函数,如下所示 类似地,我们也可以从类中传递方法 但是如果我们要传递的方法是静态的(在伴随对象中)呢? 我知道,由于它是静态的,我们可以直接调用该方法,而不必将其作为参数传递,然而,在某些情况下(例如利用现有代码时),这仍然是有用的。

  • 我正在编写一个方法,如果我想将一个类传递给一个方法,其中代码的一部分包括检查对象是否属于某种类型。这就是我想要的(但显然不行): 关于如何做到这一点有什么提示吗?谢谢!

  • 在下面的代码中,我希望将'races.class'作为参数传递给方法'get allraces()'。我该怎么做?

  • 问题内容: 我很好奇Go中是否有可能。我有多种方法的类型。是否可以有一个函数,该函数需要一个方法参数,然后将其称为类型? 这是我想要的一个小例子: Go认为type 有一个称为的方法,而不是用传入的方法名称替换它。 问题答案: 是的,有可能。您有2(3)个选项: 规范:方法表达式 该表达式产生的功能与第一个参数等效,但具有一个显式接收器。它有签名。 在这里,方法接收器是显式的。您只需将方法名称(具

  • 我正在使用Camel 2.13.1我想将一个类作为参数传递给bean中的一个方法 我能做些像 我知道我可以在header中发送限定类名,并在bean中使用它,但感觉不太对。还有其他选择吗? 我看到了这个链接,但它不适合我Apache Camel-Spring DSL-将字符串参数传递给bean方法