3

我正在使用构建器模式(如 Joshua Bloch's 中所解释的那样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}.

有没有办法在不公开变量的情况下做到这一点?

4

1 回答 1

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或者,您的构建器可以以或类似的结构公开所有字段。使用该路由,您的界面只需要链接设置器。但是您放弃了对构造函数中所有字段使用情况的编译时检查。恕我直言,妥协太大了。

于 2012-05-24T19:47:13.697 回答