代码重复(或不重复) - JAVA

时间:2012-08-15 08:56:33

标签: java interface instanceof code-duplication

我有代码重复的情况(或者是吗?)而且我不知道如何避免它,但仍然在我的代码中保持清晰。

让我大大简化过这种情况:

// let's say I have a interface Entity

interface Entity {

    public Entity add (Entity operand);

}

// And two classes that implement this interface

class MyInteger implements Entity {

    private int value;

    public Entity add (Entity operand)
    {
         // here I have to manage the situation distinctly if operand is a MyInteger or MyString

    }

}

class MyString implements Entity {

    private String value;

    public Entity add (Entity operand )
    {

    }
}

现在,我的问题是MyString中的方法添加与MyInteger中添加的方法相同。请记住,我有比这里提到的更多的类型,并且对于一些方法添加是不一样的。

此代码是否重复?如果是这样,有没有办法避免它?因为我似乎无法想到一个。

另外,在add方法中,如何在不使用if(instanceof)语句的情况下切换各种类型的操作数?

4 个答案:

答案 0 :(得分:1)

查找模板模式。您可以重构并为任何重复的代码添加Abstract类。如果这是特定于两个类的,那么只需要这两个类扩展Abstract类。

为了避免instanceof我不确定什么是最好的,但你可以链接一个特定于实体类的额外方法,然后在必要时调用超级/抽象类。

最后,研究仿制药提供的可能性。

答案 1 :(得分:1)

听起来您需要visitordouble-dispatch机制。

您的add(Entity operand)方法必须根据传递的操作数决定做什么,因此您可以通过在操作数上调用 back 来实现此目的。 e.g。

// in MyInteger
public Entity add(Entity operand) {
   operand.addInteger(this);
}

// in MyString
public Entity add(Entity operand) {
   operand.addString(this);
}

请注意,上述实现会在所调用的类型上发生更改。通过重定向回操作数,您的调用路径由最初调用所使用的操作数的实体确定。

每个实体都必须实施addInteger(MyInteger p)addString(MyString p)等等。但是在这个阶段,您可以使用具体的类型,并且可以轻松地确定要做什么。

请注意,您不必使用instanceof或类似内容。以上是类型安全和完整的。例如添加新的操作数类型将导致一组明显的重构。

答案 2 :(得分:1)

您可以使用抽象类并为其提供具体的add方法。

答案 3 :(得分:1)

到目前为止,我认为你的方法没有问题。

由于实体是一个实例,您可以通过以下方式解决代码重复问题:

  • 简单地忽略它并进行复制,因为它会为您提供一个干净的解决方案。 如果您只有少数情况发生此类重复,则可能更好 以这种方式实现它。

  • 如前所述,实现一个抽象类,例如AbstractEntity实现所有 方法一次作为受保护的成员方法,并将MyInteger和MyString声明为子类。

  • 继续进行子类化,考虑哪个实体需要哪些方法 建立一个子类树。警告:如果您这样做会妨碍进一步的调整 不能做精心设计。

  • 使用实用程序类:具有公共静态方法的类和私有构造函数 实现需要的功能。

如何找出实体的类型:

  • 使用instanceof(好吧,很难看)
  • 在接口中实现方法,将类型返回为Enum或test 对于属性:getType()== STRING或isString()
  • 在界面中按照您的意愿实现方法:checkIfStringAndAddIt()。