जावाएफएक्स संपत्ति पैटर्न पुराने, मानक जावाबीन पैटर्न को विस्तारित करने के लिए डिज़ाइन किया गया है। तो आपके उदाहरण में, जावाबीन सम्मेलन के अनुसार, आपके पास double
प्रकार की एक (रीड-राइट) संपत्ति है जिसे amount
कहा जाता है। यह दो तरीकों
public double getAmount() ;
public void setAmount(double amount);
JavaBean पैटर्न "बाध्य गुण", जिसमें सेम एक PropertyChangeListener
पंजीकरण के समर्थन के माध्यम से कुछ सीमित "observability" की अनुमति देता है से निर्धारित होता है। एक UI टूलकिट को अक्सर गुणों का पालन करने और परिवर्तनों का जवाब देने की आवश्यकता होती है। उदाहरण के लिए, text
संपत्ति रखने के लिए Label
के लिए यह समझ में आता है। यदि text
संपत्ति में परिवर्तन होता है, तो Label
को अधिसूचित करने की आवश्यकता है, ताकि यह स्वयं को पुनर्निर्मित करने के बारे में जान सके। पहली नज़र में, बाध्य गुणों वाले जावाबीन का उपयोग करना ऐसा करने का एक तरीका होगा। हालांकि, यूआई टूलकिट में इस तंत्र का उपयोग प्रदर्शन समस्याओं का उत्पादन करता है, क्योंकि अधिसूचनाएं रखने का कोई तरीका नहीं है कि मान तुरंत कंप्यूटिंग किए बिना वैध नहीं है। इसका मतलब है, उदाहरण के लिए, उस लेआउट को किसी संपत्ति में प्रत्येक व्यक्तिगत परिवर्तन पर दोबारा लगाया जाएगा।
क्या JavaFX टीम जाहिरा तौर पर ऐसा करने के लिए लक्ष्य कर रहे थे एक पैटर्न है कि
- मानक JavaBean पैटर्न पुष्टि परिभाषित था, और
- नमूदार गुण जहां अमान्यकरण निर्भर मूल्यों हर बार recomputing बिना पता लगाया जा सकता है समर्थित मूल्य बदल ("lazily नमूदार मूल्यों")
तो JavaFX समाधान गुण है जो दोनों ChangeListener
है, जब एक मूल्य परिवर्तन जो सूचित किया जाता है का समर्थन बनाने के लिए है, और InvalidationListener
एस, जो एक मान मान्य होने पर अधिसूचित किया जाता है। इसका अर्थ यह है कि, उदाहरण के लिए, एक लेआउट तंत्र ट्रैक कर सकता है कि यह अमान्य होने पर पुन: संकुचन को मजबूर किए बिना वर्तमान में मान्य है या नहीं। लेआउट केवल वास्तविक स्क्रीन पल्स (यानी जब दृश्य प्रस्तुत किया जाता है) पर फिर से लागू होगा, और केवल तभी अमान्य होगा। यहाँ है कि मध्यवर्ती मूल्य, जब width
, 2 और height
अभी भी 4 है अभिकलन कभी नहीं है
DoubleProperty width = new SimpleDoubleProperty(3);
DoubleProperty height = new SimpleDoubleProperty(4);
ObservableDoubleValue area = Bindings.createDoubleBinding(() -> {
double a = width.get() * height.get();
System.out.println("Computed area: "+a);
return a ;
}, width, height);
System.out.println("Area is "+area.getValue());
width.set(2);
height.set(3);
System.out.println("Area is "+area.getValue());
नोट:
(एक त्वरित-का-प्रमाण अवधारणा के रूप में, पर विचार करें।)
तो जावाएफएक्स में मूल्य इन अवलोकन Properties
द्वारा दर्शाए जाते हैं जो अमान्य श्रोताओं और श्रोताओं को बदलने का समर्थन करते हैं, जिसका अर्थ है कि वे मूल रूप से "आलसी रूप से देखने योग्य" हैं। एक संपत्ति एक्सेसर विधि (amountProperty()
आपके उदाहरण में) के माध्यम से संपत्ति का खुलासा करना इस कार्यक्षमता का समर्थन करने के लिए पर्याप्त है।
हालांकि, DoubleProperty
का खुलासा करने का अर्थ है कि बीन के पास double
प्रकार का मान है। पुराने जावाबीन सम्मेलन के साथ संगतता बनाए रखने के लिए, इस बीन को get
और set
विधियों को उजागर करके इस तथ्य का विज्ञापन करना चाहिए। नतीजतन, जावाएफएक्स संपत्ति पैटर्न में "संपत्ति एक्सेसर" (amountProperty()
) के साथ-साथ मानक जावाबीन विधियों (getAmount()
और setAmount(...)
) दोनों की आवश्यकता होती है। इसका अर्थ यह है कि JavaFX पैटर्न के बाद सेम का उपयोग मानक जावाबीन पैटर्न का कहीं भी किया जा सकता है, उदाहरण के लिए JPA में।
ध्यान दें कि पैटर्न सही तरीके से काम करने के लिए, यह हमेशा सच होना चाहिए कि amountProperty().get() == getAmount()
और amountProperty().set(x)
का प्रभाव setAmount(x)
जैसा ही प्रभाव है। get
और set
विधियों final
को आपके उदाहरण के अनुसार, यह गारंटी दी जाती है (भले ही बीन क्लास उप-वर्गीकृत हो)।
यदि आप संपत्ति के मूल्य को पुनर्प्राप्त करने या बदलने के लिए स्वयं विधियों का आह्वान कर रहे हैं, तो इससे कोई फर्क नहीं पड़ता कि आप किस कॉल को कॉल करते हैं, क्योंकि उन्हें समान प्रभाव होने की गारंटी है। चूंकि जावाएफएक्स प्रॉपर्टी पैटर्न जावाबीन पैटर्न का विस्तार है, get
और set
विधियों को कॉल करने के लिए बहुत ही मामूली वरीयता हो सकती है: मान में पहुंचने के अर्थ में केवल जावाबीन कार्यक्षमता की आवश्यकता होती है, पूर्ण जावाएफएक्स संपत्ति कार्यक्षमता नहीं, इसलिए यह हो सकता है केवल उस कार्यक्षमता पर भरोसा करने के लिए कुछ अर्थपूर्ण भावना बनाएं। अभ्यास में, हालांकि, इससे कोई फर्क नहीं पड़ता है जिसका आप उपयोग करते हैं।
[javafx ebook सीखें] (http://www.apress.com/9781484211434) से। 'जावाबीन्स नामकरण सम्मेलन का उपयोग करते हुए अतिरिक्त गेटर्स और सेटर्स, वर्ग को पुराने टूल और फ्रेमवर्क के साथ अंतःक्रियाशील बनाने के लिए जोड़े जाते हैं जो पुराने जावाबीन नामकरण परंपराओं को कक्षा के गुणों की पहचान करने के लिए उपयोग करते हैं। ' – Kachna
मेरी राय में, अतिरिक्त गेटर्स और सेटर्स की आवश्यकता नहीं है। – Kachna
@ कच्छ निश्चित रूप से यह आपके उपयोग के मामले पर निर्भर करता है। उदाहरण के लिए यदि आप जेपीए इकाई में जावाएफएक्स गुणों का उपयोग करना चाहते हैं, तो आपको प्राप्त करने और सेट विधियों की आवश्यकता होगी। इसी प्रकार यदि आप JSON या XML marshalling का उपयोग कर रहे हैं, आदि –