首页 > 解决方案 > 我应该使用继承吗?

问题描述

我有一个类,其中包含:

一个细节可以有 3 种类型,所有不同的属性。它们有两个共同的属性,所以我使用了继承。

问题是代码越来越难以维护,尤其是当我必须在 List 中获取详细信息时。我必须做这样的事情:

if(detail instanceof DetailType1){
   something
}
else something

有替代方案吗?有什么推荐吗?

提前欣赏。

编辑:

List<String> values = new ArrayList<String>();

for (Detail detail : fFile.getDetails())
  {
    if (detail instanceof DetailType1)
    {
      values.add(fFile.getHeader().getEntity() + "-" + detail1.getType());
      values.add(((DetailType1) detail).getServiceReference());
      values.add(fFile.getHeader().getProcessedDate());
    }
    else if (detail instanceof DetailType3)
    {
      values.add(((DetailType3) detail).getClientCode());
      values.add(((DetailType3) detail).getMaxAmount().toString());
      values.add(((DetailType3) detail).getReference());
    }
    ...
  }

标签: javaoop

解决方案


一般来说,您是正确的,instanceof 是一种难闻的气味 - 修复它的方法是通过调用接口上的方法,该接口由您使用“instanceof”的所有对象实现。

这是我在您的情况下的看法:

DetailType1 和 3 应该使用如下方法实现相同的接口:

addToValues(List<String> values){}

他们每个人都以不同的方式实现这个接口,例如,DetailType1 应该看​​起来像这样(您可能还必须传入 fFile):

 addToValues(List<String> values){
     values.add(fFile.getHeader().getEntity() + "-" + getType());
     values.add(getServiceReference());
     values.add(fFile.getHeader().getProcessedDate());
 }

然后,您的代码中的原始循环变为:

for(Detail detail : fFile.getDetails())
    detail.addToValues(values);

推荐阅读