2015-11-20 6 views
6

मैं जावा से परिचित हूं, लेकिन जावाफैक्स सीखना शुरू कर रहा हूं, और विशेष रूप से जावाएफएक्स गुणों के बारे में सीखता हूं। के रूप में ओरेकल से निम्न उदाहरण में दिखाया गया मैं मूल डिजाइन पैटर्न को समझने:जावाएफएक्स प्रॉपर्टीज सेटटर और गेटर का उपयोग करने के लिए, सीधे संपत्ति का उपयोग करने के बजाय

package propertydemo; 

import javafx.beans.property.DoubleProperty; 
import javafx.beans.property.SimpleDoubleProperty; 

class Bill { 

    // Define a variable to store the property 
    private DoubleProperty amountDue = new SimpleDoubleProperty(); 

    // Define a getter for the property's value 
    public final double getAmountDue(){return amountDue.get();} 

    // Define a setter for the property's value 
    public final void setAmountDue(double value){amountDue.set(value);} 

    // Define a getter for the property itself 
    public DoubleProperty amountDueProperty() {return amountDue;} 

} 

मैं क्या समझ में नहीं आता है जब/कारण है कि मैं बजाय संपत्ति सीधे का उपयोग करने का, मनुष्य और सेटर तरीके का प्रयोग करेंगे?

मैं क्या सोच रहा था कि आप गेटटर और/या सेटर में कुछ कस्टम कोड चाहते हैं जो डेटा के कुछ पूर्व या पोस्ट मैनिपुलेशन/सत्यापन कर सकते हैं, लेकिन यदि आप एक कस्टम गेटर और/या सेटर बनाते हैं, तो आप इसके बाद अलग-अलग परिणाम मिलेंगे, भले ही आप गेटर/सेटर या संपत्ति का उपयोग सीधे करें, जो मेरे लिए खतरनाक लगता है।

यदि गेटर/सेटर बस संपत्ति के प्राप्त करने और सेट विधियों को कॉल करता है, तो उन्हें क्यों भी?

इसमें कोई अंतर्दृष्टि की सराहना की जाएगी।

+0

[javafx ebook सीखें] (http://www.apress.com/9781484211434) से। 'जावाबीन्स नामकरण सम्मेलन का उपयोग करते हुए अतिरिक्त गेटर्स और सेटर्स, वर्ग को पुराने टूल और फ्रेमवर्क के साथ अंतःक्रियाशील बनाने के लिए जोड़े जाते हैं जो पुराने जावाबीन नामकरण परंपराओं को कक्षा के गुणों की पहचान करने के लिए उपयोग करते हैं। ' – Kachna

+0

मेरी राय में, अतिरिक्त गेटर्स और सेटर्स की आवश्यकता नहीं है। – Kachna

+0

@ कच्छ निश्चित रूप से यह आपके उपयोग के मामले पर निर्भर करता है। उदाहरण के लिए यदि आप जेपीए इकाई में जावाएफएक्स गुणों का उपयोग करना चाहते हैं, तो आपको प्राप्त करने और सेट विधियों की आवश्यकता होगी। इसी प्रकार यदि आप JSON या XML marshalling का उपयोग कर रहे हैं, आदि –

उत्तर

11

जावाएफएक्स संपत्ति पैटर्न पुराने, मानक जावाबीन पैटर्न को विस्तारित करने के लिए डिज़ाइन किया गया है। तो आपके उदाहरण में, जावाबीन सम्मेलन के अनुसार, आपके पास double प्रकार की एक (रीड-राइट) संपत्ति है जिसे amount कहा जाता है। यह दो तरीकों

public double getAmount() ; 
public void setAmount(double amount); 

JavaBean पैटर्न "बाध्य गुण", जिसमें सेम एक PropertyChangeListener पंजीकरण के समर्थन के माध्यम से कुछ सीमित "observability" की अनुमति देता है से निर्धारित होता है। एक UI टूलकिट को अक्सर गुणों का पालन करने और परिवर्तनों का जवाब देने की आवश्यकता होती है। उदाहरण के लिए, text संपत्ति रखने के लिए Label के लिए यह समझ में आता है। यदि text संपत्ति में परिवर्तन होता है, तो Label को अधिसूचित करने की आवश्यकता है, ताकि यह स्वयं को पुनर्निर्मित करने के बारे में जान सके। पहली नज़र में, बाध्य गुणों वाले जावाबीन का उपयोग करना ऐसा करने का एक तरीका होगा। हालांकि, यूआई टूलकिट में इस तंत्र का उपयोग प्रदर्शन समस्याओं का उत्पादन करता है, क्योंकि अधिसूचनाएं रखने का कोई तरीका नहीं है कि मान तुरंत कंप्यूटिंग किए बिना वैध नहीं है। इसका मतलब है, उदाहरण के लिए, उस लेआउट को किसी संपत्ति में प्रत्येक व्यक्तिगत परिवर्तन पर दोबारा लगाया जाएगा।

क्या JavaFX टीम जाहिरा तौर पर ऐसा करने के लिए लक्ष्य कर रहे थे एक पैटर्न है कि

  1. मानक JavaBean पैटर्न पुष्टि परिभाषित था, और
  2. नमूदार गुण जहां अमान्यकरण निर्भर मूल्यों हर बार 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 विधियों को कॉल करने के लिए बहुत ही मामूली वरीयता हो सकती है: मान में पहुंचने के अर्थ में केवल जावाबीन कार्यक्षमता की आवश्यकता होती है, पूर्ण जावाएफएक्स संपत्ति कार्यक्षमता नहीं, इसलिए यह हो सकता है केवल उस कार्यक्षमता पर भरोसा करने के लिए कुछ अर्थपूर्ण भावना बनाएं। अभ्यास में, हालांकि, इससे कोई फर्क नहीं पड़ता है जिसका आप उपयोग करते हैं।

+1

आपके विस्तृत स्पष्टीकरण के लिए धन्यवाद। क्या इस मामले में जहां सेटर वास्तव में उदाहरण के लिए, डेटा manipulates यदि आप एक StringProperty firstName है के बारे में: 'firstName.set (name.trim())' इस मामले सेटर विधि बुला में बुला से अलग है संपत्ति पर 'सेट() 'या जावाफैक्स गुणों के साथ यह नो-नो है। – vewert

+0

क्षमा करें, मैं एक और विस्तृत उदाहरण जोड़ना चाहता था, लेकिन ऐसा लगता है कि आप टिप्पणियों में कोड ब्लॉक नहीं जोड़ सकते हैं। – vewert

+1

आप उस उदाहरण से कई सम्मेलनों को तोड़ देंगे। जैसा कि बताया गया है, जावाएफएक्स संपत्ति पैटर्न में आपको यह गारंटी देनी चाहिए कि 'सेट फर्स्टनाम (x) '' firstNameProperty() के बराबर है। सेट (x) '। लेकिन नियमित जावा बीन पैटर्न में, आपको वास्तव में गारंटी देनी चाहिए कि 'सेट फर्स्टनाम (एक्स); getFirstName() '' x' का मूल्यांकन करता है, मानते हैं कि दो विधि कॉल के बीच ऑब्जेक्ट पर कोई अन्य ऑपरेशन नहीं होता है। यदि आप वास्तव में ऐसा कुछ करना चाहते थे, तो 'स्ट्रिंगप्रॉपर्टीबेस' उपclass और 'setString (...)' और 'setValue (स्ट्रिंग) 'ओवरराइड करें। –

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

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