【问题标题】:In java can i store a method in a variable? [duplicate]在java中我可以将方法存储在变量中吗? [复制]
【发布时间】:2011-08-21 11:02:54
【问题描述】:

可能重复:
Java - Creating an array of methods

在java中我可以将方法存储在变量中吗?例如,我可以有一组方法吗?如果是这样,我会怎么做?

【问题讨论】:

  • @Damodar:可能是重复的,也可能不是重复的,但这是一个非常好的链接,可以给 OP,赞一个。
  • @T.J. Crowder:但是 SO 不鼓励重复,请通过 SO FAQ stackoverflow.com/faq 了解应该问什么样的问题。
  • 我同意@T.J. IMO,尚不清楚这是您发现的问题的重复。这就是为什么我不投票关闭。
  • @Stephen C :无论声誉如何,在这里每个人都是平等的。我引起了适度的关注。他们会决定的。我对此没有任何权力。

标签: java methods


【解决方案1】:

在 Java 6 及更低版本中,您需要使用反射(请参阅 java.lang.reflect 包)。 Java 7 意味着在这方面有一些新特性(特别是 method handles (JSR 292) 和新的“动态调用”东西)。 Java 8(那么有些距离)看起来设置有lambda expressions(是的,该链接指向一个 OpenJDK 页面,但是they say Oracle's on board),它们并不完全相同,但它们是相关的。

【讨论】:

  • invokedynamic 是 java 字节码的助记符。
【解决方案2】:

我建议您将输出保存在一个变量中,而不是再次调用该函数。因为变量将在需要时保存在内存中。之后,自动垃圾收集将处理该问题以将其从内存中释放出来。但是,如果您将方法放入变量中,那么每次调用它时都会占用其激活记录堆栈的内存。因此,将输出存储在变量而不是方法中是一种很好的做法。

【讨论】:

  • 如果方法返回的值每次都相同、方法没有副作用、评估成本低和/或总是需要,这是一个好主意。但是,您正在通过缓存返回值来更改代码的行为。具有副作用的方法希望运行一定次数,非确定性函数可能每次都会给您不同的结果,并且在不需要时调用的方法会浪费 CPU 周期(并导致其设计的任何副作用导致,不管)。
【解决方案3】:

是的,你可以做到。你有 Method 类。

【讨论】:

    【解决方案4】:

    如果您使用reflectionMethod 数据类型,这是可能的。

    【讨论】:

      【解决方案5】:

      您可以使用反射来获取Method 对象,然后您可以对其调用invoke(..)

      【讨论】:

        【解决方案6】:

        看看,例如,返回 Class#getDeclaredMethods()

        【讨论】:

          【解决方案7】:

          是的,反思是一种方式。但是你可以使用一个接口。

          interface I {
              int add (int a, int b);
          }
          

          说你有一堂课

          class B implements I {
             int add(int a, int b){
                  return a + b;
             }
          }
          

          现在您可以创建如下函数:

          doCalculate(I mehthodInterface) {
              \\some calculations
              \\u can also use any other functions defined in this interface
              methodInterface.add(2, 3);
          }
          

          在这里,您可以拥有实现方法的接口数组。

          【讨论】:

          • 这是个好主意,但您或多或少是在创建一个方法,而不是将其存储在一个变量中。此外,int add(int a, int b); 是模棱两可的。该方法总是必须被覆盖,因此这种“存储”方法的方法是不一致的。此外,您根本没有存储方法,您只是在定义方法大纲。这些接口存在于java中作为多重继承的一种解决方法(主要是),但是我发现它没有多大用处,因为我的设计涉及抽象类,在我看来这使得接口部分过时。 是的,我知道这是一篇旧帖子。
          • 我发现这很有用。
          猜你喜欢
          • 2012-10-30
          • 1970-01-01
          • 2011-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-03
          • 2016-11-05
          • 1970-01-01
          相关资源
          最近更新 更多