在Builder模式中重复

时间:2012-05-24 18:28:53

标签: java dry

我正在使用一个构建器模式(如Joshua Bloch的Effective Java中所解释的那样)来做一些事情,并且有一个特别烦人的重复:

public class Foo {
    private String name;
    private int age;

    public static class Builder implements IBuilder {
        private String name;
        private int age;

        Builder name(String value) {
            name = value;
            return this;
        }

        Builder age(int value) {
            age = value;
            return this;
        }

        Foo build() {
           return new Foo(this);
        }
    }

    private Foo(Builder builder) {
        name = builder.name;
        age = builder.age;
    }
}

它很小,但很烦人。我必须在每个类中声明变量。我尝试使用字段创建一个类并扩展该类,但我收到错误:{variable_name} has private access in {class_name}

有没有办法做到这一点,而不公开变量?

1 个答案:

答案 0 :(得分:0)

如果您的构建器纯粹是为了捕获一堆状态(而不是进行任何中间计算),您可以通过定义构建器接口,然后编写Java代理生成器来解决重复问题。

如果你这样做,你就不能依赖外部类可以访问构建器(内部)类的私有字段。要解决这个问题,您还需要为每个字段定义访问器。例如:

public class Foo {
  public interface Builder extends IBuilder {
    Builder name(String name);
    String name();

    Builder age(int age);
    int age();
    ...
  }

  public static Builder builder() {
    return BuilderFramework.newInstance(Builder.class);
  }

  public Foo(Builder builder) {
    ...
  }
}

或者,您的构建器可以公开Map或类似结构中的所有字段。使用该路由,您的界面只需要链接设置器。但是您放弃了构造函数中所有字段用法的编译时检查。恕我直言,太妥协了。