我正在寻找一种通过引用传递方法的方法。我知道Java不传递方法作为参数,但是,我想要一个替代方案。
我被告知接口是作为参数传递方法的替代方案,但我不理解接口如何通过引用充当方法。如果我理解正确的话,接口只是一组没有定义的抽象方法。我不想发送一个每次都需要定义的接口,因为几个不同的方法可以用相同的参数调用相同的方法。
我想要完成的是类似这样的事情:
public void setAllComponents(Component[] myComponentArray, Method myMethod) {
for (Component leaf : myComponentArray) {
if (leaf instanceof Container) { //recursive call if Container
Container node = (Container) leaf;
setAllComponents(node.getComponents(), myMethod);
} //end if node
myMethod(leaf);
} //end looping through components
}
调用方法如下:
setAllComponents(this.getComponents(), changeColor());
setAllComponents(this.getComponents(), changeSize());
首先用要作为参数传递的方法定义一个Interface
public interface Callable {
public void call(int param);
}
使用该方法实现一个类
class Test implements Callable {
public void call(int param) {
System.out.println( param );
}
}
//像这样调用
Callable cmd = new Test();
这允许您将cmd作为参数传递,并调用接口中定义的方法调用
public invoke( Callable callable ) {
callable.call( 5 );
}
我不是java专家,但我可以这样解决你的问题:
@FunctionalInterface
public interface AutoCompleteCallable<T> {
String call(T model) throws Exception;
}
我在我的特殊接口中定义了参数
public <T> void initialize(List<T> entries, AutoCompleteCallable getSearchText) {.......
//call here
String value = getSearchText.call(item);
...
}
最后,我实现getSearchText方法,同时调用初始化方法。
initialize(getMessageContactModelList(), new AutoCompleteCallable() {
@Override
public String call(Object model) throws Exception {
return "custom string" + ((xxxModel)model.getTitle());
}
})
编辑:在Java 8中,lambda表达式是一个很好的解决方案,正如其他答案所指出的那样。下面的答案是为Java 7和更早的版本编写的…
看一下命令模式。
// NOTE: code not tested, but I believe this is valid java...
public class CommandExample
{
public interface Command
{
public void execute(Object data);
}
public class PrintCommand implements Command
{
public void execute(Object data)
{
System.out.println(data.toString());
}
}
public static void callCommand(Command command, Object data)
{
command.execute(data);
}
public static void main(String... args)
{
callCommand(new PrintCommand(), "hello world");
}
}
编辑:正如Pete Kirkham所指出的,还有另一种使用访问者的方法。访问者方法稍微复杂一些——您的节点都需要使用acceptVisitor()方法来感知访问者——但如果您需要遍历一个更复杂的对象图,那么它就值得研究。
首先用要作为参数传递的方法定义一个Interface
public interface Callable {
public void call(int param);
}
使用该方法实现一个类
class Test implements Callable {
public void call(int param) {
System.out.println( param );
}
}
//像这样调用
Callable cmd = new Test();
这允许您将cmd作为参数传递,并调用接口中定义的方法调用
public invoke( Callable callable ) {
callable.call( 5 );
}