java - Joshua Bloch 的 Builder 模式和 PMD 警告

标签 java pmd builder-pattern

我已经使用 Joshua Bloch 的 Builder 模式编写了一个类,类似于这个 Pizza 示例:

public class Pizza {
  private int size;
  private boolean cheese;
  private boolean pepperoni;
  private boolean bacon;

  public static class Builder {
    //required
    private final int size;

    //optional
    private boolean cheese = false;
    private boolean pepperoni = false;
    private boolean bacon = false;

    public Builder(int size) {
      this.size = size;
    }

    public Builder cheese(boolean value) {
      cheese = value;
      return this;
    }

    public Builder pepperoni(boolean value) {
      pepperoni = value;
      return this;
    }

    public Builder bacon(boolean value) {
      bacon = value;
      return this;
    }

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

  private Pizza(Builder builder) {
    size = builder.size;
    cheese = builder.cheese;
    pepperoni = builder.pepperoni;
    bacon = builder.bacon;
  }
}

但是 PMD 报告了 2 个警告:

  1. (指向方法 Builder.build()) 避免通过外部的私有(private)构造函数进行实例化 构造函数的类。 通过私有(private)实例化 来自外部的构造函数 构造函数的类通常会导致 访问器的生成。一个工厂 方法,或非私有(private)化的 构造函数可以消除这个 情况。生成的类文件 实际上是一个接口(interface)。它给 访问类的能力 调用一个新的隐藏包范围 采用接口(interface)的构造函数 作为补充参数。这个 变成私有(private)构造函数 有效地与包合二为一 范围,并且具有挑战性 辨别。
  2. 类不能被实例化并且 不提供任何静态方法 或字段。一个有私有(private)的类 构造函数,并且没有任何 静态方法或字段不能 用过。

我应该忽略这些警告吗?

另一个问题:类PizzaBuilder 中的私有(private)字段是重复的。当私有(private)字段的数量越来越大时,这会很烦人。有什么办法可以避免吗?

最佳答案

关于如何去除重复。

我会得到更多的反对票 :) 但也许是这样的?

class Pizza {
private int size;
private boolean cheese;
private boolean pepperoni;
private boolean bacon;

public static class Builder {
    private Pizza pizza = new Pizza();

    public Builder(int size) {
        pizza.size = size;
    }

    public Builder cheese(boolean value) {
        pizza.cheese = value;
        return this;
    }

    public Builder pepperoni(boolean value) {
        pizza.pepperoni = value;
        return this;
    }

    public Builder bacon(boolean value) {
        pizza.bacon = value;
        return this;
    }

    public Pizza build() {
        return pizza;
    }
}

private Pizza() {
}
}

关于java - Joshua Bloch 的 Builder 模式和 PMD 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6174419/

相关文章:

java - 为什么Spring Boot主应用总是触发PMD的HideUtilityClassConstructorCheck?

java - 我应该在 DTO 中使用构建器模式吗?

design-patterns - builder 模式和享元模式有什么区别?

java - JUnit 测试上的 "Singleton"

java - 如何解析字符串并根据java中不同定义的模式使用它?

java - Java 中的 future GUI?

java - 如何使用文本字段相应地调整矩形的大小?

eclipse - Eclipse IDE的PMD插件离线安装

java - 查找非线程安全单例 spring 实现的代码质量规则