【问题标题】:How to avoid casting and instanceOf如何避免强制转换和 instanceOf
【发布时间】:2014-09-09 09:09:44
【问题描述】:

我有一个方法可以执行以下操作:

private void computeHierarchie(GlobalKey key) {
    HierarchieValue hierarchieValue = hierarchieFactory.createHierarchie(selectedKey);
    ....
}

GlobalKey 有 4 个孩子:KeyA、KeyB、KeyC 和 KeyD。

目前我的工厂如下所示:

public class HierarchieFactory {

    // inject someFacade which has 4 different methods

    public HierarchieValue createHierarchie(GlobalKey key) {
        if (key instanceof KeyA) {
            return someFacade.computeHierarchie((KeyA) key);
        }
        if (key instanceof KeyB) {
            return someFacade.computeHierarchie((KeyB) key);
        }
        if (key instanceof KeyC) {
            return someFacade.computeHierarchie((KeyC) key);
        }
        if (key instanceof KeyD) {
            return someFacade.computeHierarchie((KeyD) key);
        }
        return new HierarchieValue();
    }

}

我真的不喜欢这种 switch-case 的东西,但老实说,我无法计算出任何有价值的重构。我尝试了类似以下的方法:

public abstract class AbstractHierarchieFactory {

    //inject someFacade

    abstract <T extends GlobalKey> HierarchieValue createHierarchie(T key);

}

然后是扩展这一类的 4 个类。一个看起来像:

public class KonzernHierarchieFactory extends AbstractHierarchieFactory {

    @Override
    HierarchieValue createHierarchie(KonzernKey konzernKey) {
        return evaFacade.computeHierarchie(konzernKey);
    }

}

这太好了! 但遗憾的是,这不起作用。你有什么其他的建议?必须有一个标准的方法来解决这个问题。

【问题讨论】:

标签: refactoring switch-statement abstract-class instanceof


【解决方案1】:

这似乎是访问者模式的主要示例。

例如假设您有一个KeyVisitor 接口,其中包含visitA(KeyA key)、...、visitD(KeyD key) 方法。然后您可以将 a 方法编码到您的 Key 类中(显然也必须从一个公共基类中获得):

void visit(KeyVisitor visitor) { visitor.visitX(this); }

在哪里用 A..D 替换 X,具体取决于班级。现在您的工厂可以实现KeyVisitor 并单独处理您的关键类。

【讨论】:

  • 您的访问方法必须返回 HierarchieValue。顺便说一句:这仅在您有一种返回类型时才有效。例如,如果返回类型是一个抽象类,您不知道您从访问方法接收到哪个子类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多