我不是Java专家,并且想知道我是否可以在其中间包含只有不同的方法来停止使用像这样的boilerplatecode:
public boolean storeAnimals(Cage cage, Collection<Anmial> animals, IConfiguration configuration) {
checkPrerequisite(cage);
String cagePath = cage.getPath();
AnimalStorage animalStore = AnimalStorage.openFile(cage, configuration);
//***/
do_sth_very_special
//***/
animalStore.closeFile();
return true;
}
public Collection<Anmial> getRedAnimals(Cage cage, IConfiguration configuration) {
checkPrerequisite(cage);
String cagePath = cage.getPath();
File animalStore = AnimalStorage.openFile(cage, configuration);
//***/
do_sth_very_special
//***/
animalStore.closeFile();
return result;
}
答案 0 :(得分:1)
由于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;
}
}