为什么内部静态类会扩展外部抽象类?

时间:2017-12-05 19:10:21

标签: java

我试图扩展一些使用复合模式实现树的现有代码。正如预期的那样,有一个界面  (Node)和表示通用节点的抽象类(AbstractNode)。后者由多个具体类型的节点(ConcreteNodeAConcreteNodeBConcreteNodeC)扩展。

我在我正在使用的代码中遇到了这个其他模式,其中具体类被实现为静态内部类,扩展了外部抽象类。同时,它们从外部(?)接口NodeA实现静态内部接口(NodeBNodeCNode)。

public interface Node {
  public static interface NodeA {}
  public static interface NodeB {}
  public static interface NodeC {}
}

public abstract class AbstractNode implements Node {

  public void foo() {
    ...
  }

  public void bar() {
    ...
  }

  ...

  public static class ConcreteNodeA extends AbstractNode implements Node.NodeA {
    ...
  }

  public static class ConcreteNodeB extends AbstractNode implements Node.NodeB {
    ...
  }

  public static class ConcreteNodeC extends AbstractNode implements Node.NodeC {
    ...
  }
}

这种模式有什么用?通过多年的Java经验,我以前从未见过这样的东西。我的直觉说它是一种巨大的代码味道,因为具体的类经常被实例化并在整个代码中多次使用。无论如何,我并不担心效率,只是这是很难保持和延伸!将它们放在不同的类中会更有意义吗,对吗?

我已经搜索了更多正式的参考文献来证明这样做是不错的主意,但还没有找到任何东西。

没有编译错误,代码完美无缺。

1 个答案:

答案 0 :(得分:13)

在描述类型的相关族(例如树的节点)时,此模式实际上非常常见。

一个原因很简单,它是一个方便的分组;这些类往往是单独的小,并且将它们全部集中在一个地方可以使它更容易阅读和维护,以及发送它们是紧密耦合的族并且打算一起使用的信号。

更令人信服的原因是它可以提供密封类的形式。通过在抽象类中使用私有构造函数,只有内部类可以访问它,这意味着内部类是允许的子类。