2009-06-18 10 views
6

मैं सिर्फ Java 7 preview presentation (pdf) पढ़ रहा था और चेन आमंत्रण पर एक स्लाइड थी। यहाँ स्लाइड में प्रयोग किया जाता उदाहरण है:जावा 7 में जंजीर आविष्कार?

// Construction with setters 
DrinkBuilder margarita = new DrinkBuilder(); 
margarita.add("tequila"); 
margarita.add("orange liqueur"); 
margarita.add("lime juice"); 
margarita.withRocks(); 
margarita.withSalt(); 
Drink drink = margarita.drink(); 

// Construction with chained invocation 
Drink margarita = new DrinkBuilder() 
    .add("tequila") 
    .add("orange liqueur") 
    .add("lime juice") 
    .withRocks() 
    .withSalt() 
    .drink(); 

और मैं इस बारे में भावनाओं को मिलाया है। किसी को एक कथन में बहुत अधिक विधि आमंत्रण नहीं करना चाहिए। दूसरी ओर, margarita.this() और margarita.that() लिखना बहुत सुविधाजनक नहीं है।

अब, मैं डेल्फी दुनिया से जावा में आ रहा हूं। और डेल्फी में with भाषा निर्माण है। यह कुछ लोगों द्वारा सराहना की जाती है और कई लोगों द्वारा लुप्त होती है (या यह दूसरी तरफ है?)। मुझे with मिलते-जुलते आमंत्रण के विचार से अधिक सुरुचिपूर्ण होने के लिए मिलता है (जो मुझे लगता है कि void विधि के आधार पर काम करता है जिस पर ऑब्जेक्ट किया गया है - और यह वह हिस्सा है जिसे मैं पसंद नहीं करता, क्योंकि void वापस आना चाहिए कुछ भी नहीं)।

मैं with भाषा सुविधा की सराहना करेंगे, जावा द्वारा अपनाया जा रहा तो उदाहरण के कोड इसलिए की तरह लिखा जा सकता है:

Drink margarita = null; 
with (new DrinkBuilder()) { 
    add("tequila"); 
    add("orange liqueur"); 
    add("lime juice"); 
    withRocks(); 
    withSalt(); 
    margarita = drink(); 
} 

मेरे अलावा कोई और श्रृंखलित मंगलाचरण के लिए इस समाधान पसंद करेंगे हूँ? किसी और को लगता है कि with जावा भाषा के लिए एक उपयोगी विस्तार हो सकता है? ("जावा ++" की आवश्यकता के बारे में किसी के प्रश्न के बारे में मुझे याद दिलाता है ...)

+2

यह जावा 7 तक सीमित नहीं है, आप विधियों में "यह" वापस लौकर एक निर्माता लिख ​​सकते हैं। एक अच्छा उदाहरण java.lang.StringBuilder है। –

+5

मुझे लगता है कि बिंदु यह है कि जावा 7 इसे वापस किए बिना चेनिंग की अनुमति देता है, इसलिए विधि कॉल के अर्थशास्त्र को बदलना। – OregonGhost

उत्तर

12

बयान साथ प्रारंभकर्ता साथ गुमनाम वर्गों का उपयोग जावा में अनुवाद किया जा सकता:

Drink margarita = new DrinkBuilder() {{ 
    add(“tequila”); 
    add(“orange liqueur”); 
    add(“lime juice”); 
    withRocks(); 
    withSalt(); 
}}.drink(); 

इस मुहावरे का उपयोग करने का कमियां अच्छी तरह से here प्रलेखित रहे हैं।

चेन आमंत्रण विधि चेनिंग के लिए एक उपनाम है। यही कारण है कि अच्छी तरह से जाना जाता है और मुहावरा जावा के किसी भी संस्करण के साथ काम करता है:

class Chained { 

    public Chained withFoo() { 
     // ... 
     return this; 
    } 

    public Chained withBar() { 
     // ... 
     return this; 
    } 
}  

JDK 7 के लिए एक प्रस्ताव allowing of chaining method also for void return type है:

class ChainedJava7 { 

    public void withFoo() { 
     // ... 
    } 

    public void withBar() { 
     // ... 
    } 
}  
+1

जब आपका उत्तर दिखाई देता था तो मैं केवल डबल ब्रेस प्रारंभिकता के बारे में लिख रहा था :-) –

+1

यह वास्तव में अच्छा है। +1 –

+2

नोट, कुछ महीने पहले जेडीके 7 में छोटी भाषा में बदलाव की समयसीमा बदल गई थी। –

1

मैं with के इस उपयोग का प्रशंसक नहीं हूं; मैं Python with statement पसंद करता हूं। मैं आपसे सहमत हूं कि void का मतलब void होना चाहिए। उदाहरण में आप प्रदान करते हैं, यदि कोई व्यक्ति वास्तव में चेन विधि आमंत्रण में सक्षम होना चाहता है तो उन्हें केवल अपनी विधियों पर रिटर्न प्रकारों को बदलना चाहिए ताकि वे श्रृंखलाबद्ध हो सकें।

+0

उम, यह शून्य है। एक निर्माता के रूप में आपको कुछ भी वापस करने की परवाह नहीं है, और आपके उपभोक्ता को कुछ भी प्राप्त करने की परवाह नहीं है (हालांकि कभी-कभी वे करते हैं)। आपको परवाह क्यों करनी चाहिए? अर्थात्, कुछ भी नहीं बदलता है (इतना टाइप करने के अलावा)। –

+0

आप को छोड़कर * कुछ वापस कर रहे हैं, और आप इसे पूरी तरह से कर रहे हैं। यदि आप कुछ भी वापस नहीं कर रहे थे, तो आप उस पर एक विधि नहीं बुला सकते थे। चूंकि यह जावा है और बाकी सब कुछ स्पष्ट है, इसलिए मैं वापसी स्पष्ट हो जाऊंगा। –

2

This आपकी रुचि हो सकती है।

2

मैं काफी है कि फार्म के with बयान की तरह है, लेकिन मैं के वीबी संस्करण पसंद करते हैं उन्हें:

With testObject 
    .Height = 100 
    .Text = "Hello, World" 
    .ForeColor = System.Drawing.Color.Green 
End With 

क्या आप जानते हैं With ब्लॉक में प्रत्येक विशेषता अभी भी एक . से पहले किया जाना है के रूप में है कि you'r ई ऑब्जेक्ट प्रॉपर्टी का संदर्भ देना और नहीं, एक स्थानीय चर, कहें, किसी भी नेमस्पेस टकराव को कम करता है।

अगर हम अपने उदाहरण लेते हैं:

with (new DrinkBuilder()) { 
    add(“tequila”); 
    add(“orange liqueur”); 
    add(“lime juice”); 
    withRocks(); 
    withSalt(); 
    margarita = drink(); 
} 

वहाँ कोई आसान तरीका है, तो withSalt()DrinkBuilder की एक विधि या स्थानीय कक्षा में एक विधि है बताने के लिए है। यदि आप केवल with -ed ऑब्जेक्ट के with ब्लॉक में विधियों की अनुमति देते हैं तो मुझे लगता है कि वे बहुत कम उपयोगी हो जाते हैं।

+0

मेरा सुझाव होगा साल्ट() पेय निर्माता का एक तरीका होगा। अगर आपको पता चला कि एप्लिकेशन ऐसा नहीं कर रहा है, तो आप इसे कॉल कर सकते हैं .withalt(); यह स्पष्ट करने के लिए कि किस वस्तु के साथ साल्ट() विधि लागू की जानी चाहिए। –

1

हो सकता है कि एक ऑब्जेक्ट पर कई सारे कॉल साइन हैं कि कुछ कोड को स्थानांतरित करने की आवश्यकता है?

+2

नहीं, यह दो वन थिंग के पूरे बीन मंत्र का हिस्सा है क्योंकि जावा में प्रथम श्रेणी के गुण नहीं हैं इसलिए हमें सब कुछ के लिए गेटर्स और सेटर्स लिखना है। इसीलिए। जावा 7 (गुण) से कुछ और गिरा दिया गया था। –

+0

@ डार्थकोडर - खुशी है कि आपने इसका उल्लेख किया है! मुझे समझ में नहीं आ रहा है कि यह 1.0 के बाद जावा का हिस्सा क्यों नहीं रहा है –

1

Effective Java में जोशुआ ब्लोच आइटम # 2 एक बिल्डर के उपयोग की दृढ़ता से अनुशंसा करता है जब आपके पास कई तर्कों के साथ एक निर्माता होता है। एक कारण यह है कि यह गारंटी देने के लिए लिखा जा सकता है कि निर्मित वस्तु हमेशा एक सतत स्थिति में होती है। यह निर्मित ऑब्जेक्ट की कक्षा में जटिल "टेलीस्कोपिंग कन्स्ट्रक्टर" रखने से भी बचाता है। फिर भी एक और यह है कि यदि आप निर्मित वस्तु को अपरिवर्तनीय (उदाहरण के लिए, थ्रेड सुरक्षा के लिए) चाहते हैं, तो इसमें सेटर विधियां नहीं हो सकती हैं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^