我非常了解构建器模式。在Joshua Bloch的有效Java中,第2项中描述的构建器模式也已经完成了。
我的问题是 - 将构建器类保留在实例化的类中是否有任何特定的好处?
我们也可以将它作为单独的构建器类并执行相同的操作。
请具体说明您的答案。我已经知道内部类可以访问构建类的私有成员以及所有这些。
答案 0 :(得分:14)
您显然已经知道嵌套类(无论是否为静态)可以访问周围类的私有成员。
所以真正的问题是:
什么成员值得私有并从构建者访问它?
答案是......构造函数!您希望将构造函数设为私有,以便根本不允许访问。您希望允许访问构建器,但构建器必须在某个时候调用构造函数,以便......构建它。
如果你有一个没有嵌套的构建器 - 可能是一个顶级类 - 你必须使目标类的构造函数至少包为private。通常不需要这样做。
结论:构建器应该是嵌套类。
哦,Davide Lorenzo MARINO的答案也是如此:当然,这也是建筑师及其周围阶层的强烈关系。
答案 1 :(得分:9)
首先:它被定义为内部类,因为它与外部类强烈相关。来自oracle site:
这是一种逻辑分组仅在一个中使用的类的方法 地点:如果一个类只对另一个类有用,那么它就是 合乎逻辑地将它嵌入该类中并将两者保持在一起。嵌套 这样的"助手班"使他们的包更加简化。
第二:它被定义为 static ,因为如果内部类不是静态的,你可以在不创建外部类的实例的情况下实例化它。
作为一个额外的好行为,您可以定义外部类private的构造函数。因此,如果没有对构建器的显式调用,则无法创建外部类。
正如JB Nizet在问题的评论中所说的那样,在javadoc中搜索外部类更容易找到构建器。
答案 2 :(得分:2)
我认为这有两个原因。
the-package.Something.Builder
,这是自解释的,不会将包与这么多类聚类。只是我的两分钱。