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

2022-09-03 17:42:13

我几乎了解构建器模式。也已经完成了在Joshua Bloch的有效java中的Item#2中描述的构建器模式。

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

我们也可以让它成为单独的构建器类,并做同样的事情。

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


答案 1

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

所以真正的问题是:

什么成员值得私有并从构建器访问它?

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

如果你有一个没有嵌套的生成器 - 也许本身就是一个顶级类 - 你必须至少使目标类的构造函数私有。这通常是不想要的。

结论:生成器应该是一个嵌套类。

哦,大卫·洛伦佐·马里诺(Davide Lorenzo MARINO)的答案也是正确的:当然,这也是建筑商及其周围阶级的牢固关系。


答案 2

首先:它被定义为内部类,因为它与外部类密切相关。从甲骨文网站

这是一种对仅在一个位置使用的类进行逻辑分组的方法:如果一个类仅对另一个类有用,那么将其嵌入该类中并将两者保持在一起是合乎逻辑的。嵌套这样的“帮助程序类”会使其包更加简化。

第二:它被定义为静态的,因为如果内部类不是静态的,则无法在不创建外部类的实例的情况下将其初始化。

作为额外的好行为,您可以定义外部类私有的构造函数。因此,如果不显式调用生成器,则无法创建外部类。

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


推荐