Java 代码重复,方法中类似的代码对多个对象执行相反的操作

Java 代码重复,方法中类似的代码对多个对象执行相反的操作,java,code-duplication,Java,Code Duplication,我想知道是否有办法删除这种重复的代码(它在我的程序中突然出现) 正如您从上面的示例中看到的,这两个方法本质上完全相同,除了哪个容器被测试为null,以及对象最终位于哪个容器中。有没有办法把这样的事情简化成一种方法? 代码后面会出现另一个示例,其中以不同的顺序测试多个对象: if (control = 1) { if(con1 == null) return con1 else if (con2 == null) return con2 else return

我想知道是否有办法删除这种重复的代码(它在我的程序中突然出现)

正如您从上面的示例中看到的,这两个方法本质上完全相同,除了哪个容器被测试为null,以及对象最终位于哪个容器中。有没有办法把这样的事情简化成一种方法? 代码后面会出现另一个示例,其中以不同的顺序测试多个对象:

if (control = 1)
{
  if(con1 == null)
    return con1
  else if (con2 == null)
    return con2
  else
    return con3
}
else
{
  if(con3 != null)
    return con3
  if(con2 != null)
    return con2
  else
    return con1
}
这种类型的语句是否可以简化为一个if

对不起,如果我的问题真的是无脑/弱智,我可能在这方面有点欠缺,特别是考虑到我在这里问的最后一个问题:/


无论如何,感谢您花时间阅读本文:)

如果可能的话,我将处理这个问题,使我希望以这种方式使用的每个类都实现相同的接口。例如,我将创建PlayerContainer类,实现一个新的可行接口,其中包含returnSomething和setSomething方法。然后,该方法将采用两个Doable类型的参数,每个对象一个参数作为工作宽度,结果是:

public interface Doable {
    Object returnSomething();
    setSomething(Object);
}

class MyClass {
    public void pickUp(Doable one, Doable two) {
        if(two.returnSomething() == null) {
            two.setSomething(one.returnSomething());
            one.setSomething(null);
        }
    }
}
编辑:请注意,returnSomething的返回类型和setSomething的参数应调整为实际使用的类型

当然,这可以应用于代码的大部分部分


如果您没有实现接口所需的类的代码,您可以扩展它们并创建子类来实现接口。

首先,您应该清楚地定义每个函数的功能。代码被复制的根本原因可能是开发人员需要该功能,然后在不知道确切功能已经实现的情况下实现了该功能。为了防止这种情况发生,开发人员应该知道在哪里寻找该功能

我强烈建议你阅读。如果不使用面向对象的原则,问题很可能再次出现


对于第二种情况,如果可能,我建议合并这些条件。但这在很大程度上取决于您的条件。

您可以引入一种新方法,实际上可以从一种方法移动到另一种方法,并根据通用功能表达另外两种方法。
拾取=从中移动->播放器
退出=从玩家移动->退出

public void pickUp(Container in)
{
    moveContainer(in, playerContainer);
}

public void dropContainer (Container out)
{
   moveContainer(playerContainer, out);
}

public void moveContainer(Container from, Container to) {
    if (to.returnSomething() == null) {
        to.setSomething(from.returnSomething());
        from.setSomething(null);
    }
}

对于第二部分,devblanked已经建议您可以这样做。但这增加了额外的空间和时间复杂性

private Object getMatch(Object obj1, Object obj2, Object obj3, boolean reverse) {
    List<Object> availableObjects = new ArrayList<Object>();
    availableObjects.add(obj1);
    availableObjects.add(obj2);
    availableObjects.add(obj3);
    int size = availableObjects.size();
    for (int i = 0 ; i < size ; i++) {
        Object nxtObject = reverse ? availableObjects.get(size - i -1) :  availableObjects.get(i);
        if (nxtObject != null) {
            return nxtObject;
        }
    }
    return null;
}
私有对象getMatch(对象obj1、对象obj2、对象obj3、布尔反向){ List availableObjects=new ArrayList(); 可用对象添加(obj1); 可用对象添加(obj2); 可用对象添加(obj3); int size=availableObjects.size(); 对于(int i=0;i对于代码的第二部分,您可以保留con1、con2。。在列表中,在列表上迭代并返回正确的值。我同意deviprasad742的第一部分,我不允许使用大学迄今为止所教授的内容以外的任何内容。不幸的是:(然而,由于我以前从未听说过该接口,我想我稍后会尝试(在作业到期后)。谢谢:)
private Object getMatch(Object obj1, Object obj2, Object obj3, boolean reverse) {
    List<Object> availableObjects = new ArrayList<Object>();
    availableObjects.add(obj1);
    availableObjects.add(obj2);
    availableObjects.add(obj3);
    int size = availableObjects.size();
    for (int i = 0 ; i < size ; i++) {
        Object nxtObject = reverse ? availableObjects.get(size - i -1) :  availableObjects.get(i);
        if (nxtObject != null) {
            return nxtObject;
        }
    }
    return null;
}