0

我正在尝试确定在 AspectJ 中调度类型的更好方法。假设我正在对具有三种节点的树执行计算。然后我可以编写一个简单的 Java 方法:

private void computation(TreeNode node) {
    if (node instanceof Node0) {
        // Do stuff.
    } else 
    if (node instanceof Node0) {
        // Do stuff.
    } else 
    if (node instanceof Node0) {
        // Do stuff.
    }
}

或者

private void computation(TreeNode node) {
    switch (node.kindNode()) {
        case NODE0:
            // Do stuff.
            break;
        case NODE1:
            // Do stuff.
            break;
        case NODE2:
            // Do stuff.
            break;
    }
}

或者我可以将一个方法注入每个节点类型:

private void Node.computation() {
    throw new UnsupportedOperationException(getClass() + ".computation()");
}

private void Node0.computation() {
    // Do stuff.
}

private void Node1.computation() {
    // Do stuff.
}

private void Node2.computation() {
    // Do stuff.
}

哪种方法更可取,为什么?

4

1 回答 1

1

什么是可取的取决于具体情况。

如果我理解你的问题是正确的,你想以某种方式在事后将这种“计算”方法添加到已经存在的类型层次结构中,并且更改原始类型的源代码不是一种选择,对吧?

在这种情况下,最重要的问题是:Node 类型层次结构的更改频率如何?因为任何此类更改都可能会迫使您调整方面,这是一个维护问题。

话虽如此——您的第三个建议是“规范的”面向对象的解决方案。在一般编程中,它通常优于 switch-case 方法,因为后者往往会导致代码复杂且难以理解,除非其中的操作computation()非常简短。基本上,与您的情况一样,基于 AspectJ 的解决方案也是如此。但是设置切面稍微困难一些,因为它必须在多个子类中注入定义,而在另一种情况下,当您使用 switch-case 解决方案时,您只需将一个小的转发方法注入基类并从那里跳到一个普通的 java 类,其中包含你的开关类型。

访问者模式:实际上,您在这里所做的看起来像是访问者模式的经典用例,可以使用方面优雅地实现。可能这将是最干净的解决方案,但访问者模式本身是一个高级主题(如果有兴趣,我可以更详细地解释)

于 2010-09-12T00:46:47.060 回答