तो मैं कुछ प्रभावी जावा पढ़ रहा हूं! और पुस्तक के सबसे प्रेरक वर्गों में से एक अपरिवर्तनीय वस्तु/बिल्डर अनुभाग है जहां ब्लोच सिर्फ पीओजेओ के बजाय "बिल्डर" वर्ग के बारे में लिखता है।जावा मॉडल ऑब्जेक्ट्स डिजाइन
नोट: मैं मॉडल के बारे में बात कर रहा हूँ यहाँ वस्तुओं: उदाहरण के लिए की तरह एक अनुच्छेद या एक कार।
इस तरह मैंने पहले इन वस्तुओं लिखा है: अब
public class Car {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
जैसा कि आप देख इस डिजाइन तरीके का एक संख्या में कमी है, यह अस्थिरता की आवश्यकता है और आप तो पहली सेटिंग निर्माता के साथ वस्तु का निर्माण करने के लिए है नाम।
अब निश्चित रूप से आप name
फील्ड फ़ाइनल बना सकते हैं और इसे कन्स्ट्रक्टर में तर्क के रूप में उपयोग कर सकते हैं, लेकिन फिर यदि आपके पास बड़ी ऑब्जेक्ट रैपिंग है उदाहरण के लिए कई SQL-टेबल्स तो आपके पास एक बदसूरत कन्स्ट्रक्टर होगा:
public Car(int horsepowers, String name, String brand, int yearManufactured,
User owner, List<User> previousOwners) {
//Set the values
}
ऑब्जेक्ट बनाते समय यह अपठनीय हो जाता है, और यह केवल छह फ़ील्ड है!
तो, बलोच (अचल स्थिति के साथ) निम्नलिखित
public class Car {
public static class Builder {
private String name;
public Builder setName(String name) {
this.name = name;
return this;
}
public Car build() {
reeturn new Car(this);
}
}
private final String name;
private Car(Builder builder) {
name = builder.name;
}
public String getName() {
return name;
}
}
//Construction example
Car car = new Car.Builder().setName("Speedy").build();
अब यह हमें अचल स्थिति देता है पता चलता है! और यदि आपके पास ऐसी कुछ वस्तुएं हैं जो आदिम या अपरिवर्तनीय नहीं हैं तो उन्हें Builder
के सेटर्स में कॉपी करें और उन्हें Car
के गेटर्स में दोबारा कॉपी करें।
लेकिन यह बहुत शब्दशः है और यदि वर्ग पर्याप्त छोटा है तो मैं कन्स्ट्रक्टर तर्कों का उपयोग कर रहा हूं। यदि किसी वर्ग को एक उत्परिवर्तनीय फ़ील्ड की आवश्यकता होती है तो मैं उस क्षेत्र को उत्परिवर्तनीय बना देता हूं, यदि कक्षा में पर्याप्त गुण हैं (> 4 कुछ)।
एक और समस्या यह है कि एंड्रॉइड और कक्षा के साथ काम करने के लिए उदाहरण के लिए Bitmap
है, तो आपको वास्तविक बिटमैप वापस करना होगा और इसकी प्रतिलिपि नहीं लेनी चाहिए क्योंकि यह प्रदर्शन - महंगा है।
मैंने इस तरह के कई प्रश्न देखे हैं लेकिन मुझे इस प्रश्न पर एक अच्छा जवाब नहीं मिल रहा है: क्या इन डिज़ाइनों पर कोई मानक है और उनका डिज़ाइन कैसा है? लाभ/पराजय क्या हैं?
अग्रिम धन्यवाद!
संपादित करें:
सवाल यह है:
सबसे अच्छा तरह से एक बड़ी एक वस्तु मॉडल है कि अपरिवर्तनीय और एक साथ होना चाहिए) क्षेत्रों की एक छोटी संख्या और बी के निर्माण के लिए) क्या है क्षेत्रों की संख्या? उपर्युक्त और इसी तरह के मुद्दों का उल्लेख Bitmap
समस्या को कैसे संभालें? कुछ क्षेत्रों को परिवर्तनीय बनाना?
अस्पष्ट होने के लिए खेद है।
मैं 'की बात लगता है Builder' जब आप अपरिवर्तनीय साथ काम कर रहे है कुछ आवश्यक और वैकल्पिक क्षेत्रों के साथ वस्तु। चूंकि आप फ़ील्ड को 'अंतिम' घोषित करेंगे। तो यह हर डिजाइन पर लागू नहीं होता है। – Sam