重用代码以循环遍历多维数组

sub*_*nid 2 java refactoring loops command-pattern

假设我有一个多维数组作为类的一个成员和许多方法,它循环遍历数组的每个元素然后对它进行操作.代码可能如下所示:

public class Baz {

    private Foo[][] fooArray = new Foo[100][100];

    public Baz() {
        for (int i = 0; i < fooArray.length; i++) {
            for (int j = 0; j < fooArray[i].length; j++) {
                // Initialize fooArray
            }
        }
    }

    public void method1() {
        for (int i = 0; i < fooArray.length; i++) {
            for (int j = 0; j < fooArray[i].length; j++) {
                // Do something with fooArray[i][j] 
            }
        }
    }

    public void method2() {
        for (int i = 0; i < fooArray.length; i++) {
            for (int j = 0; j < fooArray[i].length; j++) {
                // Do something else with fooArray[i][j] 
            }
        }
    }

    // and so on
}
Run Code Online (Sandbox Code Playgroud)

现在,由于循环的代码总是相同的,只有循环内的操作发生变化,循环代码是否有可能以某种方式被重构为单独的方法?能够这样做真是太好了

doInLoop(functionToExecute());
Run Code Online (Sandbox Code Playgroud)

如果可能的话,最接近做这样的事情会是什么?

Mar*_*nik 6

您正在寻找的是命令模式:定义单方法接口并将其作为匿名类实现为每个用例.您将此接口的实例传递给一个方法,该方法执行所有样板并仅为有趣的部分调用您的方法:

public void forAllMembers(Foo[][] fooArray, Command c) {
    for (int i = 0; i < fooArray.length; i++) {
        for (int j = 0; j < fooArray[i].length; j++) {
            c.execute(fooArray[i][j]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,等待Java 8,它将引入Lambdas并将为您的问题提供一流的解决方案!