構建器實現Cloneable並覆蓋clone(),而不是複製構建器的每個字段,不可變類保留構建器的專用克隆。這可以很容易地返回一個新的構建器,並創建一個不可變實例的稍微修改後的副本。這是一個不可變類和Builder模式的有效Java實現嗎?
這樣我可以去
MyImmutable i1 = new MyImmutable.Builder().foo(1).bar(2).build();
MyImmutable i2 = i1.builder().foo(3).build();
Cloneable接口被認爲是打破幾分,但是任何違反這一良好的Java編碼實踐,有沒有什麼問題,這個建構?
final class MyImmutable {
public int foo() { return builder.foo; }
public int bar() { return builder.bar; }
public Builder builder() { return builder.clone(); }
public static final class Builder implements Cloneable {
public Builder foo(int val) { foo = val; return this; }
public Builder bar(int val) { bar = val; return this; }
public MyImmutable build() { return new MyImmutable(this.clone()); }
private int foo = 0;
private int bar = 0;
@Override public Builder clone() { try { return (Builder)super.clone(); } catch(CloneNotSupportedException e) { throw new AssertionError(); } }
}
private MyImmutable(Builder builder) { this.builder = builder; }
private final Builder builder;
}
我試圖削減一些角落,並避免顯式複製字段。 「basedOn」方法非常清晰,但它需要我複製字段(再次)。也許我太懶惰了。 – Aksel 2010-09-13 19:52:18
很棒的建議basedOn方法:) – troig 2017-03-23 13:36:01