Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成器模式中的重复_Java_Dry - Fatal编程技术网

Java 生成器模式中的重复

Java 生成器模式中的重复,java,dry,Java,Dry,我使用构建器模式(正如Joshua Bloch在《高效Java中所解释的那样)做了一些事情,其中涉及到一个特别恼人的重复: public class Foo { private String name; private int age; public static class Builder implements IBuilder { private String name; private int age; Build

我使用构建器模式(正如Joshua Bloch在《高效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\u name}在{class\u name}
中具有私有访问权


有没有一种方法可以做到这一点,而不公开变量?

如果构建器纯粹是为了捕获一组状态(而不是进行任何中间计算),那么可以通过定义构建器接口,然后编写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) {
    ...
  }
}

或者,构建器可以公开
映射
或类似结构中的所有字段。使用该路由,您的接口将只需要链接设置器。但是您放弃了对构造函数中所有字段用法的编译时检查。嗯,太大的妥协了。

为什么不对这些变量使用
protected
而不是
private
?这甚至不是构建器模式。生成器模式不会将生成器作为参数传递给构造函数。