gpt4 book ai didi

java - builder 模式中的重复

转载 作者:行者123 更新时间:2023-12-04 14:00:05 24 4
gpt4 key购买 nike

我在一些事情上使用构建器模式(如 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}

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

最佳答案

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

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

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

关于java - builder 模式中的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10743236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com