通过将其添加到参数来调用另一个函数

时间:2012-11-06 15:48:54

标签: java function parameter-passing

我想知道是否可以通过向参数添加函数名来调用另一个函数。因此,例如我想制作一个包含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的函数

2 个答案:

答案 0 :(得分:3)

这是一个想法。

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

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);

答案 1 :(得分:1)

正如@Jesper所说,有可能通过反思,而且可能只有反射。反射是一个对象可以分析自身并迭代它的成员(属性和方法)的过程。在你的情况下,似乎你正在寻找一种方法。

通过代码的外观,看起来你想要的是,事实上,将一个函数对象传递给你的代码,在那里可以应用一个参数。这在Java中是不可能的。在Java 8中添加闭包可以实现类似的功能。您可以通过将Closure作为参数或其他支持闭包或函数的语言传递给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.