2010-01-13 10 views
8

मैं जावा में नया हूं, और मैं कुछ क्लास वेरिएबल्स बनाना चाहता हूं जिन्हें गतिशील रूप से गणना के दौरान गणना की जाती है, जैसा कि आप प्रॉपर्टी() विधि का उपयोग कर पाइथन में कर सकते हैं। हालांकि, मुझे सच में यकीन नहीं है कि इसका वर्णन कैसे किया जाए, इसलिए गूगलिंग मुझे जावा "प्रॉपर्टी" कक्षा के बारे में बहुत कुछ दिखाता है, लेकिन यह वही बात प्रतीत नहीं होता है। पाइथन की संपत्ति() के बराबर जावा क्या है?पायथन की संपत्ति() के जावा समतुल्य क्या है?

+0

प्रतिक्रियाओं के लिए धन्यवाद। बस स्पष्ट करने के लिए, मुझे पता है कि जावा आमतौर पर आपको गेटर्स और सेटर्स के माध्यम से सदस्यों तक पहुंचने के लिए प्रोत्साहित करता है। मेरा प्रश्न यह था कि जावा आपको किसी सदस्य (उदा। Obj.member) तक पहुंचने की अनुमति देता है, और दृश्यों के पीछे गेटर/सेटर को कॉल करता है, इसलिए x = obj.member वास्तव में x = obj.getMember() कर देगा। – Cerin

उत्तर

7

जावा भाषा में ऐसी कोई सुविधा नहीं बनाई गई है। आपको अपने आप से सभी गेटर्स और सेटर्स को स्पष्ट रूप से लिखना होगा। ग्रहण जैसे आईडीई हालांकि आपके लिए इस बॉयलरप्लेट कोड उत्पन्न कर सकते हैं।

उदाहरण के लिए:

class Point{ 
    private int x, y; 

    public Point(int x, int y){ 
    this.x = x; 
    this.y = y; 
    } 

    public void setX(int x){ 
    this.x = x; 
    } 

    public int getX(){ 
    return x; 
    } 

    public void setY(int y){ 
    this.y = y; 
    } 

    public int getY(){ 
    return y; 
    } 
} 

आप Project Lombok जो एनोटेशन @Getter और @Setter कि कुछ हद तक पायथन के property के समान हैं प्रदान करता है पर एक नजर है सकते हैं।

लंबोक के साथ, ऊपर के उदाहरण कम कर देता है के लिए:

class Point{ 
    @Getter @Setter private int x, y; 

    public Point(int x, int y){ 
    this.x = x; 
    this.y = y; 
    } 
} 
+0

यह करीब है लेकिन फिर भी जब कोई संपत्ति (जो किसी विशेषता की तरह उपयोग की जाती है) में परिवर्तन करने के लिए डायनामिक विधियों का आह्वान करने की अनुमति नहीं होती है। यहां कुछ पायथन कोड हैं जो कई अन्य ऑब्जेक्ट विशेषताओं को समायोजित करते हैं, बस यूरी को 'सेटिंग' खरीदते हैं: https://bitbucket.org/russellballestrini/miniuri/src/tip/miniuri.py –

+1

आप ऊपर दिखाए गए कन्स्ट्रक्टर को परिभाषित करने से छुटकारा पा सकते हैं @AllArgsConstructor का उपयोग करके। – Nik

0

क्या आप कक्षा में नए फ़ील्ड/गेटर्स/सेटर्स बनाना चाहते हैं? यदि आप रनटाइम में ऐसा करना चाहते हैं, तो आपको अपने फ़ील्ड और विधियों के साथ पूरी तरह से नई कक्षा बनाना होगा, और इसे JVM में लोड करना होगा। नई कक्षा बनाने के लिए आप एएसएम या सीजीएलआईबी जैसी लाइब्रेरी का उपयोग कर सकते हैं, लेकिन यदि आप जावा के लिए नए हैं, तो यह ऐसा कुछ नहीं है जिसे आप शुरू करना चाहते हैं।

2

वे वास्तव में नहीं है मौजूद हैं। जावा में सदस्यों को private या protected के रूप में घोषित करना आम है और केवल विधियों के माध्यम से उन्हें एक्सेस करने की अनुमति देता है। अक्सर यह बहुत छोटे getFoo() और setFoo(newFoo) विधियों की ओर जाता है। पायथन में वास्तव में private और protected नहीं है और सदस्यों के लिए सीधे पहुंच की अनुमति देना अधिक आम है।

1

जैसा कि अन्य ने ध्यान दिया है, जावा के पास गेटर्स और सेटर्स हैं, लेकिन कोई सख्त एनालॉगन नहीं है। Project Lombok नामक एक थर्ड पार्टी लाइब्रेरी है जो कॉमाइल समय पर .class फ़ाइलों में गेटर्स और सेटर्स जेनरेट करने के लिए एनोटेशन का उपयोग करती है। इसका उपयोग चीजों को थोड़ा कम वर्बोज़ बनाने के लिए किया जा सकता है।

+3

-1, जब आपके पास जोड़ने के लिए कुछ नया नहीं है, तो आपको पहले से मौजूद उत्तरों को ऊपर उठाना चाहिए। –

+0

मेरा जोड़ा परियोजना लंबोक को इंगित कर रहा था। ग्रेमेटर 9.0 ने बाद में इसे शामिल करने के लिए अपना जवाब संपादित किया। –

+0

बेवकूफ आरोप मत बनाओ। मेरे उत्तर का संपादन समय (13:18) आपके उत्तर के पोस्टिंग समय से पहले है (13:33)। – missingfaktor

-1

असल में आप जावा में इस व्यवहार को अनुकरण कर सकते हैं।

चेतावनी:

public Object getProperty(String property, Object obj) { 
    if (obj != null && property != null) { 
     Field field = obj.getClass().getDeclaredField(property); 
     field.setAccessible(true); 
     try { 
      return field.get(obj); 
     } catch (Exception ex) { 
      return null; 
     } 
    } 
    return null; 
} 

आप वास्तव में यह एक स्थिर पद्धति के रूप में घोषित कर सकता है और उसके बाद सिर्फ इस आयात: नीचे

बदसूरत समाधान आप नीचे दिए गए कोड की तरह एक उपयोगिता कक्षा में एक विधि लिख सकते हैं अपनी कक्षाओं में विधि जो इस व्यवहार की आवश्यकता होगी।

वैसे, ग्रोवी इस सुविधा का समर्थन करते हैं।

+0

कृपया मेरी पोस्ट को और अधिक बारीकी से पढ़ें। मैं इंस्टेंस सदस्यों तक पहुंचने के लिए एक फ़ंक्शन की तलाश नहीं कर रहा था। मैं एक ऐसी सुविधा की तलाश में था जो एक समारोह को कॉल करता है जब मैं एक इंस्टेंस सदस्य का संदर्भ देता हूं। उदा। myobj.attribute = 123; वास्तव में करेगा: myobj.setAttribute (123); – Cerin

3

बिल्ट-इन प्रॉपर्टी() फ़ंक्शन वास्तव में उत्तरों में वर्णित वर्णन के विपरीत है। यह सदस्य चर के लिए गेटर्स और सेटर्स उत्पन्न करने के बारे में नहीं है। यह आपको किसी संपत्ति तक पहुंचने के लिए एक विधि कॉल करने की अनुमति देता है (इसलिए, हालांकि आप केवल ते पायथन कक्षा में एक चर का उपयोग करते हैं, एक फ़ंक्शन को कॉल किया जाएगा)। (this post यह बताता है कि इसका उपयोग कैसे और क्यों करें।)
यह कहा गया है, जावा इस तरह कुछ भी नहीं पेश करता है। और भी, जावा में संपत्ति का उपयोग निराश है। मुझे लगता है कि आप इसे ग्रोवी स्क्रिप्ट भाषा और मेटा जादू में कर सकते हैं।लेकिन मैं अपने सिर से यह नहीं जानता कि यह कैसे करें।

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