gpt4 book ai didi

具有通用类型边界的 Java Builder 模式

转载 作者:搜寻专家 更新时间:2023-10-31 19:50:44 25 4
gpt4 key购买 nike

我正在尝试使用构建器模式而不是伸缩构造函数创建一个具有许多参数的类。我按照 Joshua Bloch 的 Effective Java 中描述的方式执行此操作,在封闭类上使用私有(private)构造函数,并使用公共(public)静态 Builder 类。 Builder 类确保对象在调用 build() 之前处于一致状态,此时它将封闭对象的构造委托(delegate)给私有(private)构造函数。因此

public class Foo {

// Many variables

private Foo(Builder b) {
// Use all of b's variables to initialize self
}

public static final class Builder {

public Builder(/* required variables */) {

}

public Builder var1(Var var) {
// set it
return this;
}

public Foo build() {
return new Foo(this);
}

}

}

然后我想为一些变量添加类型界限,因此需要对类定义进行参数化。我希望 Foo 类的边界与 Builder 类的边界相同。

public class Foo<Q extends Quantity> {

private final Unit<Q> units;
// Many variables

private Foo(Builder<Q> b) {
// Use all of b's variables to initialize self
}

public static final class Builder<Q extends Quantity> {
private Unit<Q> units;

public Builder(/* required variables */) {

}

public Builder units(Unit<Q> units) {
this.units = units;
return this;
}

public Foo build() {
return new Foo<Q>(this);
}

}

}

这编译很好,但编译器允许我做一些我认为应该是编译器错误的事情。例如

public static final Foo.Builder<Acceleration> x_Body_AccelField =
new Foo.Builder<Acceleration>()
.units(SI.METER)
.build();

这里的单位参数不是Unit<Acceleration>但是Unit<Length> , 但它仍然被编译器接受。

我在这里做错了什么?我想在编译时确保单位类型正确匹配。

最佳答案

units应该返回 Builder<Q> , 不是非基因化的 Builder .

关于具有通用类型边界的 Java Builder 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2853328/

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