Java Builder模式实现,哪个更好?

问题描述 投票:-1回答:1

看着约书亚·布洛赫(Joshua Bloch)在Java中做构建器模式的方式,我有这个类:

public class NutritionFacts {
  private final int calories;
  private final int fat;
  private final int sodium;

  public static class Builder {

    private int calories = 0;
    private int fat = 0;
    private int sodium = 0;

    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) {
    calories = builder.calories;
    fat = builder.fat;
    sodium = builder.sodium;
  }
}

我可以通过这种方式调用以实例化NutritionualFacts对象:

NutritionFacts cocacola = new NutritionFacts.Builder().calories(140).build()

我可以在这个班上也有一些变化:

public class NutritionFacts {
      private final int calories;
      private final int fat;
      private final int sodium;

      public static class Builder {

        private int calories = 0;
        private int fat = 0;
        private int sodium = 0;

        private Builder(){
        }

        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);
        }
      }

      public static Builder builder(){
       return new Builder()
      }

      private NutritionFacts(Builder builder) {
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
      }
    }

现在,我可以执行此操作以创建NutritionFacts的实例:

NutritionFacts cocacola = NutritionFacts.builder().calories(140).build()

应用构建器模式的首选方法是什么?在结果(干净,不变性等)方面,上述两种方法是否完全相同?第二种方法有什么问题吗?

我想请您对此提出专家意见。

[查看Jousha Bloach在Java中进行构建器模式的方式,我上了此类:公共类NutritionFacts {私人最终int脂肪;私人最终int钠; ...

java design-patterns builder
1个回答
0
投票

第二个在现有代码中更为常见。它们几乎完全相同,因此很难为任何一种形式争论基本风格,只是我猜第二种形式都较短,并且使用的外来语言功能更少(我猜称内部构造函数是非常外来的)。请注意,某些IDE配置会自动尝试通过在顶部添加:import com.foo.yourpackage.NutritionFacts.Builder;并将代码转换为:new Builder().calories(140).build();来“帮助您”,这也不是您想要的。同样,当仔细阅读NutritionFacts类的javadoc时,如何用第一种形式制作一个可能并不明显。而如果有明确的静态builder()方法,我会立即看到。

© www.soinside.com 2019 - 2024. All rights reserved.