代码之家  ›  专栏  ›  技术社区  ›  Andriy Drozdyuk Pickels

在Java手册中实现Builder接口

  •  4
  • Andriy Drozdyuk Pickels  · 技术社区  · 14 年前

    我正在读乔舒亚·布洛赫的《有效Java》。在第16页的顶部,他说:

    Note that our NutritionFacts.Builder class could be declared to implement
    Builder<NutritionFacts>.
    

    但是“构建器”如何实现“构建器”接口,因为存在命名空间冲突,例如:

    public static class Builder implements Builder<NutritionFacts>...
    

    我应该将内部静态类重命名为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;
    }
    }
    
    1 回复  |  直到 14 年前
        1
  •  4
  •   Angelo Genovese    14 年前

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

    public static class Builder implements my.package.Builder<NutritionFacts> {