Java 生成器模式中的重复
我使用构建器模式(正如Joshua Bloch在《高效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
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
?这甚至不是构建器模式。生成器模式不会将生成器作为参数传递给构造函数。