我有一个简单的构建器示例来说明问题“如何阻止构建器参数被设置两次?”
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);
}
}
}
答案 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
您可以选择构建方法的位置,具体取决于您是否需要某些值组合才能正确构建类型。
显然,单独的界面技术使界面美观流畅,并限制了你想要的使用方式 - 但它增加了大量的额外代码供你考虑。