बिल्डर क्लोनबल लागू करता है और क्लोन() को ओवरराइड करता है और बिल्डर के हर क्षेत्र की प्रतिलिपि बनाने के बजाय, अपरिवर्तनीय वर्ग बिल्डर का निजी क्लोन रखता है। यह एक नए निर्माता को वापस करना और एक अपरिवर्तनीय उदाहरण की थोड़ी संशोधित प्रतियां बनाना आसान बनाता है।क्या यह एक अपरिवर्तनीय वर्ग और बिल्डर पैटर्न का वैध जावा कार्यान्वयन है?
इस तरह से मैं
MyImmutable i1 = new MyImmutable.Builder().foo(1).bar(2).build();
MyImmutable i2 = i1.builder().foo(3).build();
जा सकते हैं Cloneable इंटरफेस कुछ हद तक तोड़ा जा करने के लिए कहा है, लेकिन इस के किसी भी अच्छा जावा कोडिंग अभ्यास का उल्लंघन करता है, इस निर्माण के साथ कोई समस्या है?
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;
}
मैं कुछ कोनों को काटने और स्पष्ट रूप से फ़ील्ड की प्रतिलिपि बनाने से बचने की कोशिश कर रहा था। "आधारितऑन" विधि वास्तव में स्पष्ट है लेकिन मुझे फ़ील्ड (दोबारा) कॉपी करने की आवश्यकता होगी। शायद मैं बहुत आलसी हूं। – Aksel
ग्रेट सुझाव ऑनऑन विधि :) – troig