我想将方法作为参数传递给方法,我想开发如下系统。
如何在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()
{
}
}
答案 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)