删除java中的重复代码

时间:2010-03-13 07:55:05

标签: java refactoring code-duplication

class A extends ApiClass
{
   public void duplicateMethod()
   {
   }
}    


class B extends AnotherApiClass
{
   public void duplicateMethod()
   {
   }
}

我有两个扩展不同api类的类。这两个类有一些重复 方法(在两个类中重复相同的方法)以及如何删除这种重复?

修改

ApiClass和AnotherApiClass都不在我的控制之下

5 个答案:

答案 0 :(得分:2)

根据代码的不同,您可以执行以下操作:

public class Util
{
    public static void duplicateMethod()
    {
        // code goes here
    }
}

然后让另外两个duplicateMethods调用那个。因此代码不会重复,但方法名称和对Util.duplicateMethod的调用将是。

如果Util.duplicateMethod中的代码需要访问A和B类的实例/类变量,那么它就不会很好用,但它可能会完成(如果你需要,请告诉我)。 / p>

编辑(根据评论):

使用实例变量它变得不那么漂亮......但是可以完成。类似的东西:

interface X
{
    int getVar();
    void setVar(A a);
}

class A 
    extends    ApiClass
    implements X
{
}

class B
    extends    AnotherApiClass
    implements X
{
}

class Util
{
    public static void duplicateMethod(X x)
    {
       int val = x.getVal();
       x.setVal(val + 1);
    }
}

因此,对于您需要访问的每个变量,您将为get创建一个方法(并在需要时设置)。我不喜欢这种方式,因为它使get / set方法公开,这可能意味着你正在提供你不想要的东西。另一种方法是用反射做一些事情,但我更喜欢这样: - )

答案 1 :(得分:1)

听起来像“战略模式”的情况。

class A extends ApiClass {
   private ClassContainingDupMethod strategy;
}

class N extends AnotherApiClass {
   private ClassContainingDupMethod strategy;

   public methodCallingDupMethod(){
      strategy.dupMethod();
   }
}

class ClassContainingDupMethod{
   public dupMethod(){;}
}

或者是Api类中的dupMethod?

答案 2 :(得分:1)

依赖于成员变量的重复方法也意味着重复的成员变量 - 并且开始闻起来像太大的类。如果您要将这些变量提取到自己的类中,然后将该类组成其他类,那么这些特定成员变量(使用方法)会是什么样子? Prefer composition over inheritance

答案 3 :(得分:0)

class BaseApiClass
{
   public void duplicateMethod()
   {
   }
}

class ApiClass  extends BaseApiClass
{
}
class AnotherApiClass  extends BaseApiClass
{
}

class A extends ApiClass
{
}    

class B extends AnotherApiClass
{
}

答案 4 :(得分:0)

您需要将这些类组合成一个对象,然后使用其他两个类将所有类组合在一起,修改它们的代码以使用单个类。