删除重复的代码:使用if嵌套for循环

时间:2019-03-24 06:59:50

标签: java

我多次重复以下模式:

for() {
    //Same Code Here
    for() {
        //Same Code Here
        if() {
            //Only Part That Is Different
        }
    }
}

我当时以为他们不会重复自己,而是会陷入自己的方法中,并在if中返回一些内容:

public MyObject myMethod(MyObject myObject) {
    for() {
        //Same Code Here
        for() {
            //Same Code Here
            if() {
                return myObject;
            }
        }
    }
}

这样,我可以调用myMethod(),将返回的值分配给变量,然后执行我想要的操作。这不会编译,因为如果不满足if条件,则不会返回任何内容。如果条件不满足,我不希望发生任何事情。

我走了正确的路,还是有更好的方法删除重复的代码?

3 个答案:

答案 0 :(得分:3)

如果您至少使用Java 8,请执行以下操作:

public void myMethod(MyObject obj, Consumer<MyObject> action) {
  for() {
    for() {
      if() {
        action.accept(obj)
      }
    }
  }
}

现在,您可以通过传递给它的不同操作来调用此方法:

myMethod((obj) -> System.out.println(obj))

答案 1 :(得分:1)

如果您使用的是 Java 7 或更早版本,则可以使用接口作为 myMethod 的参数。然后在您希望发生不同事情的代码中,调用接口上的抽象方法。抽象方法的不同实现会导致不同的事情发生。

public interface DoSomething {

    public void doingSomething();
}
public class DoX implements DoSomething {

    public void doingSomething() {
        System.out.println("doing x");
    }
}
public class DoY implements DoSomething {

    public void doingSomething() {
        System.out.println("doing y");
    }
}
public class MyObject {
    
    public void myMethod(DoSomething doSomething) {
        for(int i = 0; i < 3; i++) {
            System.out.print(i);
            for(int j = 0; j < 3; j++) {
                System.out.print(j);
                if(i == 1 && j == 2) {
                    doSomething.doingSomething();
                }
            }
        }   
        System.out.println("");
    }
}

然后将抽象方法的具体实现作为参数传递给您希望发生不同的事情

public class MyApp {
    public static void main(String[] args) {
        
        MyObject myObject = new MyObject();

        myObject.myMethod(new DoX());
        myObject.myMethod(new DoY());

    }
}

答案 2 :(得分:-1)

这是解决问题的一种方法:

public MyObject myMethod(MyObject myObject) {
    for() {
        //Same Code Here
        for() {
            //Same Code Here
            if() {
                return myObject;
            }
        }
    }
    MyObject myObject2 = null
    return myObject2;
}