0

我不是 Java 专家,我想知道是否可以包装仅在中间不同的方法以停止使用这样的样板代码:

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;
}
4

1 回答 1

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;
    }

}
于 2013-05-11T20:23:57.030 回答