《Effective Java》书中的《实现 Builder 接口》

And*_*yuk 5 java

我正在阅读 Joshua Bloch 所著的《Effective Java》。在第 16 页的顶部,他说:

Note that our NutritionFacts.Builder class could be declared to implement
Builder<NutritionFacts>.
Run Code Online (Sandbox Code Playgroud)

但是“Builder”如何实现“Builder”接口,因为那里存在命名空间冲突,例如:

public static class Builder implements Builder<NutritionFacts>...
Run Code Online (Sandbox Code Playgroud)

我应该将内部静态类重命名为 NutritionFacts.NutritionBuilder 还是什么?

这是他提供的构建器模式:

// Builder Pattern
public class NutritionFacts {
 private final int servingSize;
 private final int servings;
 private final int calories;
 private final int fat;
 private final int sodium;
 private final int carbohydrate;

public static class Builder {
    // Required parameters
    private final int servingSize;
    private final int servings;

    // Optional parameters - initialized to default values
    private int calories      = 0;
    private int fat           = 0;
    private int carbohydrate  = 0;
    private int sodium        = 0;

    public Builder(int servingSize, int servings) {
        this.servingSize = servingSize;
        this.servings    = servings;
    }

    public Builder calories(int val)
        { calories = val;      return this; }
    public Builder fat(int val)
        { fat = val;           return this; }
    public Builder carbohydrate(int val)
        { carbohydrate = val;  return this; }
    public Builder sodium(int val)
        { sodium = val;        return this; }

    public NutritionFacts build() {
        return new NutritionFacts(this);
    }
}

private NutritionFacts(Builder builder) {
    servingSize  = builder.servingSize;
    servings     = builder.servings;
    calories     = builder.calories;
    fat          = builder.fat;
    sodium       = builder.sodium;
    carbohydrate = builder.carbohydrate;
}
}
Run Code Online (Sandbox Code Playgroud)

Ang*_*ese 5

您可以完全限定接口名称。

IE:

public static class Builder implements my.package.Builder<NutritionFacts> {
Run Code Online (Sandbox Code Playgroud)