将方法作为参数传递给Java

时间:2014-10-11 08:18:18

标签: java

我想将方法​​作为参数传递给方法,我想开发如下系统。

如何在java中开发它?

伪代码:

class A
{
    public void test(Method method, Method method2)
    {
        if(Condition)
        {
            method.run();
        }
        else
        {
            method2.run();
        }
    }
}

class B
{
    A a = new A();
    a.test(foo(),bar());

    public void foo()
    {
        print "hello";
    }
    public void bar()
    {
    }
}

3 个答案:

答案 0 :(得分:3)

你没有通过某种方法。您传递实现接口的类的对象。在您的情况下,现有的Runnable接口将很好地适应,因为它有一个run方法,没有输入参数且没有返回值。

class A
{
    public void test(Runnable method, Runnable method2)
    {
        if(Condition)
        {
            method.run();
        }
        else
        {
            method2.run();
        }
    }
}

class B
{
    public static void main (String[] args)
    {
        A a = new A();
        Runnable r1 = new Runnable() {
            public void run() {
                System.out.println("hello1");
            }
        };
        Runnable r2 = new Runnable() {
            public void run() {
                System.out.println("hello2");
            }
        };
        a.test(r1,r2);
    }
}

如果您使用的是Java 8,则可以使用lambda表达式简化语法:

class B
{
    public static void main (String[] args)
    {
        A a = new A();
        a.test(() -> System.out.println("hello1"),() -> System.out.println("hello2"));
    }
}

或者您可以使用方法引用(同样,仅在Java 8中),编译器可以将其与test()方法所期望的功能接口匹配:

class B
{
    public static void main (String[] args)
    {
        A a = new A();
        a.test(B::foo,B::bar); // though foo() and bar() must be static in this case,
                               // or they wouldn't match the signature of the run()
                               // method of the Runnable interface expected by test()
    }
}

答案 1 :(得分:2)

这取决于您的方案和您正在使用的Java版本。

使用所谓的单抽象方法接口功能接口anonymous classes是Java中的常见模式。您基本上是通过接口实现匿名类,并将结果对象传递给您的方法。这适用于所有版本的Java。

// CheckPerson is the interface to implement
fetchPersons(
    new CheckPerson() {
        public boolean test(Person p) {
            return p.getGender() == Person.Sex.MALE
                && p.getAge() >= 18
                && p.getAge() <= 25;
        }
    }
);

Java 8重新创建了这个概念,并提供了Lambda Expressions,使事情变得更加优雅和实用。

fetchPersons(
    (Person p) -> p.getGender() == Person.Sex.MALE
        && p.getAge() >= 18
        && p.getAge() <= 25
);

除上述解决方案外,您可能对Command Pattern感兴趣。

答案 2 :(得分:0)

使用该方法签名创建一个接口,并使用您的方法实现传递它的匿名子类。

创建一个包含你想要作为参数传递的方法的接口:

 public interface methodInterface{

   method(parameter here);


}

然后在类

中实现它

然后为每个范围检查方法创建实现:

    public class class1 implements methodInterface{

    public method(//parameters here) {
        // do something
    }

}

然后您的其他方法的签名变为:

public void enterUserInput(methodInterface method)