Builder, Cloneable ve clrid() geçersiz kılmaları uygular ve oluşturucunun her alanını kopyalamak yerine, immutable sınıfı, oluşturucunun özel bir kopyasını tutar. Bu, yeni bir oluşturucuyu döndürmeyi ve değiştirilemeyen bir örneğin biraz değiştirilmiş kopyalar oluşturmayı kolaylaştırır. BenBu, değişmez bir sınıfın ve Builder modelinin geçerli bir Java uygulaması mı?
MyImmutable i1 = new MyImmutable.Builder().foo(1).bar(2).build();
MyImmutable i2 = i1.builder().foo(3).build();
gidebilir
Bu şekilde klonlanabilir arabirimi biraz kırık olduğu söyleniyor, ama bunların hiçbirini herhangi bir sorun bu yapılanmasıyla vardır iyi java kodlama pratiği ihlal ediyor?
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;
}
Bazı köşeleri kesmeye ve alanları açıkça kopyalamaktan kaçınmaya çalışıyordum. "BasedOn" yöntemi gerçekten açık ama alanları kopyalamamı gerektiriyor (yine). Belki de çok tembelleşiyorum. – Aksel
Harika bir öneri basedOn yöntemi :) – troig