限制构建器模式参数

时间:2016-01-31 00:43:07

标签: design-patterns

我有一个简单的构建器示例来说明问题“如何阻止构建器参数被设置两次?”

SimpleVehicle kia = new SimpleVehicle.Builder().setPrice(100).setType("Kia").setPrice(120).build();

System.out.println(kia.toString());

价格已经设定为100,然后又设定为120.是否可以防止这种情况发生?打印返回 - SimpleVehicle {price = 120,type ='Kia'}这是建筑师被要求做的。

SimpleVehicle类是

public class SimpleVehicle {

private long price;
private String type;

private SimpleVehicle(Builder builder) {
    this.price = builder.price;
    this.type = builder.type;
}

@Override
public String toString() {
    return "SimpleVehicle{" +
            "price=" + price +
            ", type='" + type + '\'' +
            '}';
}

public static class Builder {

    private long price;
    private String type;

    public Builder(){

    }

    public Builder setPrice(long value) {
        this.price = value;
        return this;
    }

    public Builder setType(String value) {
        this.type = value;
        return this;
    }

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

}

}

1 个答案:

答案 0 :(得分:1)

如果已经设置了值,你总是可以抛出异常,只需要有int minValidSpot = int.MaxValue, minX, minY; for (int x = (int)border + 1; x < worldX + int(border) / 4; x++) { for (int y = (int)border + 1; y < worldY + int(border) / 4; y++) { if (worldMapXY[x,y] = 0) { validSpotArr[x,y] = x + y; } else { validSpotArr[x,y] = 9999; } if ( minValidSpot > validSpotArr[x,y] ) { minValidSpot = validSpotArr[x,y]; minX = x; minY = y; } } } 之类的其他标志,并测试它是否已设置为true并抛出。

如果您想首先实际阻止此类访问,唯一的方法是提供单独的接口。

private bool _priceSet

您可以选择构建方法的位置,具体取决于您是否需要某些值组合才能正确构建类型。

显然,单独的界面技术使界面美观流畅,并限制了你想要的使用方式 - 但它增加了大量的额外代码供你考虑。