我最近开始阅读Joshua Bloch撰写的Effective Java。我发现Builder模式[书中的项目2]的想法非常有趣。我试图在我的项目中实现它,但是有编译错误。本质上,以下是我想做的事情:
具有多个属性的类及其构建器类:
public class NutritionalFacts { private int sodium; private int fat; private int carbo; public class Builder { private int sodium; private int fat; private int carbo; public Builder(int s) { this.sodium = s; } public Builder fat(int f) { this.fat = f; return this; } public Builder carbo(int c) { this.carbo = c; return this; } public NutritionalFacts build() { return new NutritionalFacts(this); } } private NutritionalFacts(Builder b) { this.sodium = b.sodium; this.fat = b.fat; this.carbo = b.carbo; } }
我尝试使用上述课程的课程:
public class Main { public static void main(String args[]) { NutritionalFacts n = new NutritionalFacts.Builder(10).carbo(23).fat(1).build(); } }
我收到以下编译器错误:
一个包含有效java.BuilderPattern.NutritionalFacts.Builder的封闭实例。NutritionalFacts n = new NutritionalFacts.Builder(10).carbo(23).fat(1).build();
我不明白该消息的含义。请解释。上面的代码类似于Bloch在他的书中建议的示例。
使构建器成为一个static类。然后它将起作用。如果它是非静态的,则将需要其拥有的类的实例-重点是不要拥有它的实例,甚至禁止在没有构建器的情况下创建实例。
static
public class NutritionFacts { public static class Builder { } }