为什么构建器应该是静态内部类?

Bha*_*ngi 12 java design-patterns

我非常了解构建模式.在Joshua Bloch的有效Java中,第2项中描述的构建器模式也已经完成了.

在这里,我的问题是 - 在实例化的类中保留构建器类是否有任何特定的好处?

我们也可以将它作为单独的构建器类并执行相同的操作.

请具体说明您的答案.我已经知道内部类可以访问构建类的私有成员以及所有这些.

See*_*ose 14

您显然已经知道嵌套类(无论是否为静态)可以访问周围类的私有成员.

所以真正的问题是:

什么成员是私人的,并从建设者访问它?

答案是......构造函数!您希望将构造函数设为私有,以便根本不允许访问.您希望允许访问构建器,但构建器必须在某个时间调用构造函数...以便...构建它.

如果你有一个没有嵌套的构建器 - 可能是一个顶级类 - 你必须使目标类的构造函数至少包为private.这通常不是想要的.

结论:构建器应该是嵌套类.

哦,Davide Lorenzo MARINO的答案也是如此:当然,这也是建造者及其周围阶级的强烈关系.


Dav*_*INO 9

第一:它被定义为内部类,因为它与外部类强烈相关.来自oracle 网站:

它是一种逻辑分组仅在一个地方使用的类的方法:如果一个类只对另一个类有用,那么将它嵌入该类并将两者保持在一起是合乎逻辑的.嵌套这样的"帮助类"使得它们的包更加简化.

第二:它被定义为静态,因为如果内部类不是静态的,则不能在不创建外部类的实例的情况下实例化它.

作为一个额外的好行为,您可以定义外部类private的构造函数.因此,如果没有对构建器的显式调用,则无法创建外部类.

正如JB Nizet在问题的评论中所说的那样,在javadoc中搜索外部类更容易找到构建器.