我正在使用一个构建器模式(如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}
。
有没有办法做到这一点,而不公开变量?
答案 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
或类似结构中的所有字段。使用该路由,您的界面只需要链接设置器。但是您放弃了构造函数中所有字段用法的编译时检查。恕我直言,太妥协了。