【问题标题】:Calling another function by adding it to a parameter通过将另一个函数添加到参数来调用另一个函数
【发布时间】:2012-10-26 14:44:34
【问题描述】:

我想知道是否可以通过将函数名称添加到参数来调用另一个函数。因此,例如,我想制作一个包含 4 个部分的脚本。每个部分都需要输入(我使用的是扫描仪,不要问为什么 :P 它的任务),然后需要将其传递给另一个脚本,例如计算和东西。

我从这个开始:

static int intKiezer(String returnFunctie, String text) {

    Scanner vrager = new Scanner(System.in);
    while (true) {

        System.out.println(text);
        int intGekozen = vrager.nextInt();

        if (vrager.hasNextInt()) {

            returnFunctie(intGekozen);
        }

        else {

            vrager.next();
            System.out.println("Verkeerde invoer!");
        }
    }

如您所见,我试图通过调用它(returnFunctie(intgekozen))将获得的值推送到另一个函数。它应该以 intgekozen 作为参数调用 returnFunctie。但它不起作用

我会这样调用函数:intKiezer(sphereCalculations, "What radius do you want to have?")。所以输入的答案,如果正确的话,应该传递给另一个名为 sphereCalculations 的函数

【问题讨论】:

  • 代码中的 returnFunctie(...) 在哪里?
  • 这在原则上可以通过反射实现,但真正的问题是:你为什么要这样做?这表明你的程序有一个奇怪的设计。 (反射应该只用于特殊情况,我不想学习你的坏习惯)。
  • 问题是我有多个输入,我想为它们创建一个函数。不只是在每个功能中说明扫描仪类,例如这对我来说似乎是最简单的方法,因为我只需要添加一个文本和一个函数名

标签: java function parameter-passing


【解决方案1】:

这是一个想法。

定义一个接口,该接口具有一个方法,可以执行您想要执行的任何计算。例如:

interface Algorithm {
    int execute(int value);
}

然后定义一个或多个实现接口的类并执行您希望它们执行的任何计算。例如:

class MultiplyByTwo implements Algorithm {
    public int execute(int value) {
        return value * 2;
    }
}

class AddThree implements Algorithm {
    public int execute(int value) {
        return value + 3;
    }
}

然后,编写您的方法,使其接受Algorithm 作为参数。使用所需的值执行算法。

static int intKiezer(Algorithm algo, String text) {
    // ...

    return algo.execute(intGekozen);
}

通过传入接口Algorithm的实现类之一的实例来调用您的方法。

int result = intKiezer(new MultiplyByTwo(), "Some question");
System.out.println("Result: " + result);

【讨论】:

  • 好的,我明白了:)。唯一的事情是我还没有使用类。但是我尝试用你告诉我的技巧来编辑我的脚本。我不知道我是否正确应用它。不应该只添加 return "returnFunctie.execute(intGekozen);"
  • +1 如果你不想有太多的类,你甚至可以取消匿名实现
【解决方案2】:

正如@Jesper 所说,反射是可能的,而且可能只有反射。反射是对象可以分析自身并遍历其成员(属性和方法)的过程。就您而言,您似乎正在寻找一种方法。

从您的代码看起来,实际上您想要的似乎是将一个函数对象传递给您的代码,其中可以应用一个参数。这在 Java 中是不可能的。通过添加闭包,Java 8 中可能会出现类似的情况。您可以在 Groovy 中通过传递闭包作为参数或其他支持闭包或函数的语言来做到这一点。

您可以通过定义抽象类/接口,将其实例传递给您的方法,然后调用将参数传递给它的方法来接近您想要的,例如:

interface Function <T> {
  public Integer call(T t);
}


public class TestFunction {
    static int intKiezer(Function<Integer> returnFunctie, String text) 
    {
        int a = 10;
        System.out.println(text);

        return returnFunctie.call(a);
    }

    public static void main(String[] args)
    {
        Function<Integer> function = new Function<Integer>() {
          public Integer call(Integer t) { return t * 2; }
        };

        System.out.println( intKiezer(function, "Applying 10 on function") );
    }
}

如果你的意图是调用一个方法,那么你最好使用一些反射库。 Apache Common's MethodUtil 浮现在脑海中。我认为这是你的男人:

invokeMethod(Object object, String methodName, Object arg)
    Invoke a named method whose parameter type matches the object type.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多