gpt4 book ai didi

java - 有没有好的方法继承一个Builder类来添加更多选项?

转载 作者:太空宇宙 更新时间:2023-11-04 09:22:20 25 4
gpt4 key购买 nike

如果我尝试继承构建器来添加更多选项,我会收到一个不需要的要求,即按特定顺序设置选项。例如,让我为类 java.awt.geom.Point2D 构建两个构建器。在基础构建器中,我们只能设置 X,但在扩展基础构建器的第二个构建器中,我们还可以设置 Y:

private static class PointBuilder{
private double x = 0.0;
protected double y = 0.0;

PointBuilder withX(double x) {
this.x = x;
return this;
}

Point2D build() {
return new Point2D.Double(x, y);
}
}

private static class PointBuilderWithY extends PointBuilder {
PointBuilder withY(double y) {
this.y = y;
return this;
}
}

public static void main(String[] args) {

Point2D pt1 = new PointBuilder()
.withX(5.0)
// .withY(3.0) // withY() doesn't compile, which is the intended behavior
.build();

// I can use a PointBuilderWithY only if I set the Y option first.
Point2D pt2 = new PointBuilderWithY()
.withY(3.0)
.withX(5.0)
.build();

// If I set the X option first, the Y option doesn't build!
Point2D pt3 = new PointBuilderWithY()
.withX(5.0)
.withY(3.0) // Won't compile! withX() didn't return a PointBuilderWithY
.build();

System.out.println(pt1);
System.out.println(pt2);
System.out.println(pt3);
}

如果我在 withY() 之前调用 withX(),则 withY() 方法将无法编译,因为 withX() 方法没有返回 PointBuilderWithY 类。 PointBuilder 基类没有 withY() 方法。

我知道我可以向基类添加一个抽象的 withY() 方法,但这违背了这一点。我想将 withY() 方法的使用限制为仅那些需要它的对象。换句话说,我希望编译器强制执行使用第一个 PointBuilder 时不能调用 withY() 的限制。同时,我不想告诉我的用户必须按特定顺序指定选项,因为这会造成困惑。我更喜欢编写万无一失的系统。用户希望以任意顺序指定选项,这使得该类更易于使用。

有办法做到这一点吗?

最佳答案

PointBuilderWithY中重写PointBuilder的所有方法以返回PointerBuilderWithY实例。

private static class PointBuilderWithY extends PointBuilder {
@Override
PointBuilderWithY withX(double x) {
return (PointBuilderWithY) super.withX(x);
}

PointBuilderWithY withY(double y) {
this.y = y;
return this;
}
}

关于java - 有没有好的方法继承一个Builder类来添加更多选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58151764/

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