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

时间:2015-07-23 06:03:32

标签: java design-patterns

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

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

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

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

3 个答案:

答案 0 :(得分:14)

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

所以真正的问题是:

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

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

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

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

哦,Davide Lorenzo MARINO的答案也是如此:当然,这也是建筑师及其周围阶层的强烈关系。

答案 1 :(得分:9)

首先:它被定义为内部类,因为它与外部类强烈相关。来自oracle site

  

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

第二:它被定义为 static ,因为如果内部类不是静态的,你可以在不创建外部类的实例的情况下实例化它。

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

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

答案 2 :(得分:2)

我认为这有两个原因。

  1. 构建器可以访问外部cass私有内容,因此不需要其他人可访问的setter。 - 我知道你已经知道了。
  2. 构建器类名称为the-package.Something.Builder,这是自解释的,不会将包与这么多类聚类。
  3. 只是我的两分钱。