由于 java 不提供一种闭包,因此您可以为其使用接口。在这种情况下,您可以执行以下操作:
public Collection<Anmial> commonMethod(Cage cage, IConfiguration configuration, Runnable runnable) {
checkPrerequisite(cage);
String cagePath = cage.getPath();
File animalStore = AnimalStorage.openFile(cage, configuration);
//***/
runnable.run();
//***/
animalStore.closeFile();
return result;
}
你的方法是这样的:
public boolean storeAnimals(Cage cage, Collection<Anmial> animals, IConfiguration configuration) {
commonMethod(cage, animals, configuration, new Runnable() {
public void run() {
System.out.println("something special");
}
});
return true;
}
当然,Runnable
接口只是为了举例说明这个想法,您可以根据需要实现接口。如果您需要内部代码访问外部定义的某些变量,您可以将其作为参数传递,如果外部代码需要访问内部定义的某些变量,您可以从调用中返回它们。
您可以定义一个通用接口,如:
public interface Executable<ReturnType, ParameterType> {
ReturnType execute(ParameterType parameter);
}
如果您需要更多参数来执行代码,您可以构建一个包含代码执行所需的所有字段的类。这同样适用于结果。
这将是返回字符串列表的想法:
new Executable<List<String>, Void>() {
public List<String> execute(Void void) {
// something special
return new ArrayList<String>();
}
}
当您需要为执行提供更多对象时,可以使用ParameterObject来解决问题。假设你有一个Integer
和一个boolean
需要执行,这意味着你将有一个类持有一个Integer
和一个boolean
类似的:
public class MyParameter {
private boolean b;
private Integer i;
public MyParameter(Integer i, boolean b) {
this.b = b;
this.i = i;
}
// getters
}
new Executable<Void, MyParameter>() {
public Void execute(MyParameter params) {
// something special
System.out.println(params.getI());
return null;
}
}