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

Java 为什么构建器应该是静态的内部类?,java,design-patterns,Java,Design Patterns,我非常了解构建器模式。还已经使用了Joshua Bloch的有效java中第2项中描述的构建器模式 这里我的问题是-将builder类保留在实例化的类中有什么特殊的好处吗 我们还可以将其作为单独的生成器类,并执行相同的操作 请具体回答。正如我已经知道的,内部类可以访问building类的私有成员以及所有这些。首先,它被定义为内部类,因为它与外部类密切相关。来自oracle: 这是一种逻辑分组类的方法,这些类只在一个应用程序中使用 place:如果一个类只对另一个类有用,那么它就是 将其嵌入该类并

我非常了解构建器模式。还已经使用了Joshua Bloch的有效java中第2项中描述的构建器模式

这里我的问题是-将builder类保留在实例化的类中有什么特殊的好处吗

我们还可以将其作为单独的生成器类,并执行相同的操作


请具体回答。正如我已经知道的,内部类可以访问building类的私有成员以及所有这些。首先,它被定义为内部类,因为它与外部类密切相关。来自oracle:

这是一种逻辑分组类的方法,这些类只在一个应用程序中使用 place:如果一个类只对另一个类有用,那么它就是 将其嵌入该类并将两者保持在一起是合乎逻辑的。筑巢 这样的“助手类”使它们的包更加精简

第二:它被定义为static,因为如果内部类不是静态的,那么在不创建外部类的实例的情况下,就无法对其进行恢复

作为一个额外的好行为,您可以定义外部类private的构造函数。因此,如果不显式调用生成器,就不可能创建外部类


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

我认为这有两个原因

  • 建设者可以访问外部cass私有内容,因此不需要其他人可以访问的setter。-我知道你已经知道了
  • 构建器类名将是package.Something.builder,这是不言自明的,不会将包与这么多类聚集在一起

  • 只要我的两分钱。

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

    因此,真正的问题是:

    哪位会员值得成为私人会员并从建筑商处访问该会员?

    答案是。。。建造师!您希望将构造函数设置为私有,以完全不允许访问。您希望允许访问生成器,但生成器必须在某个时间调用构造函数以。。。好。。。建造它

    如果您有一个未嵌套的构建器(可能是一个顶级类本身),则必须使目标类的构造函数至少包私有。这通常是不需要的

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


    哦,戴维德·洛伦佐·马里诺的答案也是正确的:当然,这也是建筑商与其周围阶级之间的密切关系。

    那么你已经知道答案了。如果它在一个单独的类中,那么构建器字段必须是包私有的或受保护的,才能被最终的类构造函数访问。最后一个类构造函数也必须是包私有的或受保护的,才能被生成器访问。另外,在发现API时,要找到Builder类会有点困难。没什么大不了的,但是为什么不使用静态的内部类呢?谢谢Davide Lorenzo MARINO!我们可以将它们与命名约定联系起来。假设我的类名是“String”,那么我可以拥有单独的“StringBuilder”类。我编辑答案是为了向您展示静态内部类的其他有用行为。@Bhavesh请注意,String和StringBuilder不是一个类,也不是一个内部静态类。StringBuilder不是一个真正的构建器(作为构建器模式)。同样,在继承的情况下,外部类的私有构造函数将不起作用。如果我有两个具有is-a关系的类,它们有它们的内部构建器类。我也非常了解String和StringBuilder。刚才给了您一个示例静态嵌套类不能访问封闭类的其他成员@拉曼萨西和?你试过了吗?如果这样做,您将看到,您可以访问私有实例成员(通过对象引用),也可以从嵌套的静态类访问私有类成员。