Является ли это допустимой Java-реализацией неизменяемого класса и шаблона Builder?

Builder реализует Cloneable и переопределяет clone (), и вместо того, чтобы копировать каждое поле построителя, неизменяемый класс хранит частный клон построителя. Это упрощает возврат нового компоновщика и создание слегка измененных копий неизменяемого экземпляра.

Я могу пойти по этому пути

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;
}
9
задан Aksel 13 September 2010 в 08:13
поделиться