为什么构建器模式使用new关键字虽然它的构造函数是私有的?

时间:2013-12-22 11:25:09

标签: java design-patterns

我看到了代码Java Builder Pattern。除了下面的代码,一切都很好:

public static void main(String[] args) {
                NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
                                .calories(100).sodium(35).carbohydrate(27).build();
        }

NutritionFacts构造函数是私有的,Builder内部类是静态的。因此,我们可以使用NutritionFacts.Builder访问此类,但为什么它使用新关键字,如new NutritionFacts.Builder(240, 8)

2 个答案:

答案 0 :(得分:6)

  • new NutritionFacts.Builder()创建Builder类的新实例,而不是NutritionFacts因此营养因素的构造函数无关紧要(可以是私有的,受保护的,公共的,包级别的)
  • BuilderNutritionFacts中定义的静态类,因此您不需要NutritionFacts的实例来创建Builder类的新实例和Builder可以调用其顶级类(私有,受保护,公共,包级别)的任何构造函数

答案 1 :(得分:1)

“...如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。” (JLS §6.6.1

这也意味着嵌套类(在顶级类的主体内)可以访问其私有成员和构造函数。实际上,这是您可能希望在代码中使用嵌套类的主要原因之一。