लोमबॉक का उपयोग करके एक मौजूदा एक वस्तु का निर्माण करें


105

आइए कहते हैं कि मेरे पास एक लुम्बोक एनोटेट वर्ग है

@Builder
class Band {
   String name;
   String type;
}

मुझे पता है मैं कर सकता हूँ:

Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();

क्या मौजूदा वस्तु का उपयोग टेम्पलेट के रूप में करना और इसके गुणों में से एक को बदलने के लिए फू का एक उद्देश्य बनाना है?

कुछ इस तरह:

Band nirvana = Band.builder(rollingStones).name("Nirvana");

मैं इसे लम्बोक डॉक्यूमेंटेशन में नहीं ढूंढ सकता।

जवाबों:


232

आप toBuilderअपने उदाहरणों को एक toBuilder()विधि देने के लिए पैरामीटर का उपयोग कर सकते हैं ।

@Builder(toBuilder=true)
class Foo {
   int x;
   ...
}

Foo f0 = Foo.builder().build();
Foo f1 = f0.toBuilder().x(42).build();

से प्रलेखन :

यदि बिल्डरों को उत्पन्न करने के लिए @Builder का उपयोग करके अपनी कक्षा के उदाहरणों का निर्माण करें (यह हमेशा ऐसा होता है जब तक @Builder को किसी ऐसी विधि से न जोड़ा जाए जो आपके प्रकार को वापस नहीं करती है), आप @Builder (toBuilder = true) का भी उपयोग कर सकते हैं। अपनी कक्षा में एक आवृत्ति विधि जिसे टूबरी () कहा जाता है; यह एक नया बिल्डर बनाता है जो इस उदाहरण के सभी मूल्यों के साथ शुरू होता है।

डिस्क्लेमर: मैं एक लुम्बोक डेवलपर हूं।


12
@ मुस्तफा वहाँ भी है @Wither, जो एकल क्षेत्र परिवर्तनों के लिए अधिक कुशल है Foo f1 = f0.withX(42):।
मातरिनस 13

@maaartinus मुझे लगता है कि मौजूदा @Witherविधियों के क्षेत्र को स्थापित करने के बजाय * ऐसी विधियाँ उत्पन्न होती हैं जो हमेशा एक नई वस्तु लौटाती हैं। यह कम दक्षता का है।
MGhostSoft

3
@MGhostSoft मैं स्पष्ट रूप से मान रहा हूं कि एक नई वस्तु बनाना rhe लक्ष्य है। इस प्रकार अपरिवर्तनीय वस्तुओं का अधिक से अधिक उपयोग करने के कारण हम बहुत सामान्य हैं। ++ × एकल फ़ील्ड को बदलने के लिए, @Witherसबसे अच्छा है। दो से अधिक, toBuilderजीतता है। नीचे मेरा जवाब देखें।
मारार्टिनस

2
और शून्य फ़ील्ड के लिए (अर्थात बिना किसी परिवर्तन के ऑब्जेक्ट कॉपी), @Witherबिल्कुल भी काम नहीं .toBuilder().build()करेगा।
एम। जस्टिन

40

क्या मौजूदा वस्तु का उपयोग टेम्पलेट के रूप में करना और इसके गुणों में से एक को बदलने के लिए फू का एक उद्देश्य बनाना है ? ( जोर मेरा )

यदि आप वास्तव में एकल संपत्ति को बदलना चाहते हैं, तो एक अच्छा और अधिक कुशल तरीका है:

@With
class Band {
   String name;
   String type;
}

Band nirvana = rollingStones.withName("Nirvana");

मुरझाया हुआ कचरा नहीं बनाता है, लेकिन यह सिर्फ एक क्षेत्र को बदल सकता है। कई क्षेत्रों को बदलने के लिए, आप उपयोग कर सकते हैं

withA(a).withB(b).withC(c)....

और कचरे के टन (सभी मध्यवर्ती परिणाम) लेकिन toBuilderअधिक कुशल और अधिक प्राकृतिक है।

नोट: लम्बोक के पुराने संस्करणों ने @Witherएनोटेशन का उपयोग किया है । प्रलेखन की शुरुआत देखें ।


1
क्या यह वास्तव में इतना कचरा पैदा करेगा? मुझे लगता है कि यह आपके द्वारा प्रतिस्थापित की जा रही फ़ील्ड को छोड़कर सभी उथली प्रतियां हैं (इस धारणा पर भरोसा करते हुए कि आप ऑब्जेक्ट को पहले से ही अपरिवर्तनीय बना देंगे यदि वह इरादा है)। "कचरा" ज्यादातर उच्च स्तरीय वस्तु के संदर्भों को छोड़ दिया जाएगा (हालांकि मुझे लगता है कि बहुत सी प्राइमेटीज़ के परिणामस्वरूप अधिक कचरा भी हो सकता है)।
jm0

1
@ jm0 ज़रूर, यह सभी उथली प्रतियां हैं। "टन कचरा" से मेरा मतलब n-1वस्तुओं की एक श्रृंखला के nलिए था withSomething। एक वस्तु की कीमत कुछ बाइट्स प्लस 4 या 8 बाइट्स प्रति संदर्भ प्लस 1 से 8 बाइट्स प्रति आदिम है। तो हम प्रति कॉल के दसियों बाइट्स के बारे में बात कर रहे हैं। कोई बड़ी बात नहीं, आमतौर पर।
माआर्टिनस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.