2009-05-17 21 views
22

मैं जावा के लिए नया हूँ, लेकिन ActionScript 3 के साथ कुछ OOP अनुभव है में setters, इसलिए मैं सामान मैं जानता हूँ कि पर निर्भर विस्थापित करने के लिए कोशिश कर रहा हूँ।Getters/जावा

ActionScript 3 में आप getters और प्राप्त का उपयोग कर setters बनाते हैं तथा कीवर्ड निर्धारित करते हैं, आप उस वर्ग का एक उदाहरण के एक संपत्ति के माध्यम से वर्ग और पहुँच डेटा में एक विधि बनाने के अर्थ कर सकते हैं। मैं जटिल लग सकता है, लेकिन यह नहीं है।

class Dummy{ 

    private var _name:String; 

    public function Dummy(name:String=null){ 
     this._name = name; 
    } 

    //getter 
    public function get name():String{ 
     return _name; 
    } 

    //setter 
    public function set name(value:String):void{ 
    //do some validation if necessary 
     _name = value; 
    } 

} 

और मैं के रूप में एक वस्तु में name का उपयोग होगा::

var dummy:Dummy = new Dummy("fred"); 
trace(dummy.name);//prints: fred 
dummy.name = "lolo";//setter 
trace(dummy.name);//getter 

मैं कैसे जावा में क्या होता है कि यहाँ एक उदाहरण है?

बस कुछ सार्वजनिक क्षेत्रों होने सवाल से बाहर है। मैंने देखा है प्राप्त का उपयोग कर के इस सम्मेलन है कि वहाँ और विधियों, जो मैं के साथ ठीक कर रहा हूँ के सामने निर्धारित किया है।

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

class Dummy{ 

    String _name; 

    public void Dummy(){} 

    public void Dummy(String name){ 
     _name = name; 
    } 

    public String getName(){ 
     return _name; 
    } 

    public void setName(String name){ 
     _name = name; 
    } 

} 

वहाँ ActionScript 3 गेटर/जावा में setters के एक बराबर है, के रूप में में वर्ग का एक उदाहरण से एक क्षेत्र के रूप में एक निजी क्षेत्र तक पहुँचने, लेकिन लागू करने के लिए एक विधि होने वह कक्षा में आंतरिक रूप से?

+13

ऐसा लगता है कि आप जावा प्रोग्रामर के लिए एक बहुत संवेदनशील बिंदु मार रहे हैं;) – bbmud

+0

इनपुट के लिए आप सभी को धन्यवाद। जब से जावा कोड लिखते समय मैं जावा सम्मेलन में रहूंगा :) आईडीई के लिए मैंने ग्रहण और नेटबीन की कोशिश की है और मैं उन्हें दोनों पसंद करता हूं, मेरा दिमाग नहीं बना सकता। नेटबीन में कुछ अच्छी जीयूआई विशेषताएं हैं (केवल नमूने की जांच की गई है)। मैं प्रारंभिक (जार बनाने के लिए) टर्मिनल का उपयोग करने के लिए चिपक जाऊंगा और सब कुछ, कम से कम जब तक मैं अपने पैरों पर नहीं पहुंच जाता। जावा पर शुरुआती राय: यय: बहुत सारी शक्ति! Meh: आप सब कुछ करना चाहिए? जमीन के कुछ भी गंभीर होने के लिए ऐसा लगता है कि आपको बहुत सी कोड लिखना होगा। –

उत्तर

20

नहीं। एएस 3 गेटर्स और सेटर्स एक ईसीएमएस्क्रिप्ट चीज हैं। जावा में, आप getVal() और setVal() शैली कार्यों के साथ फंस गए हैं - चीजों को आपके लिए आसान बनाने के लिए कोई वाक्य रचनात्मक चीनी नहीं है।

मुझे लगता है कि ग्रहण स्वचालित रूप जेनरेट हालांकि चीजों के उन प्रकार मदद कर सकते हैं ...

+2

तो नेटबीन "एनकप्लेटुलेट फ़ील्ड्स" – nxadm

+1

के साथ करता है तो एम-एक्स जेडीई-जेन-गेट-सेट-विधियों के साथ Emacs/JDEE करता है। – Glenn

+12

हां - पसंद का आपका संपादक शायद वही काम कर सकता है। मैंने सुना है कि एम-एक्स एम-तितली आपके लिए बाकी कार्यक्रम भी लिख सकती है :) – zenazn

2

जावा में, एक ही विकल्प है कि आप अपने वस्तु के आंतरिक प्रकट किए बिना है आप के रूप में अपने स्वयं के getters और setters बनाने के लिए है आपके उदाहरण में

सम्मेलन get या set को उस क्षेत्र के सामने प्रीपेड करना है जिसे बदला जा रहा है। इसलिए, जैसा कि आपके उदाहरण में, क्षेत्र name में getName और setName क्रमशः उनके संबंधित गेटर और सेटर के रूप में विधियां होंगी।

10

आपका जावा कोड ठीक है, सिवाय इसके कि आप _nameनिजी बनाना चाहते हैं।

कोई और अपने AS3 उदाहरण के रूप में सेट जावा में खोजशब्दों को पाने रहे हैं। क्षमा करें, यह पहले से ही आप जो कर रहे हैं उससे बेहतर नहीं है।

सही कोड:

class Dummy { 
    private String _name; 

    public void Dummy() {} 

    public void Dummy(String name) { 
    setName(name); 
    } 

    public String getName() { 
    return _name; 
    } 

    public void setName(String value) { 
    _name = value; 
    } 
} 
+0

लिंक के लिए धन्यवाद, जावा लिखते समय मैं जावा सम्मेलनों में रहूंगा। और मैं Java के बारे में बात करते समय गुण फ़ील्ड को कॉल करने का वादा करता हूं;) –

+0

@ जॉर्ज गुण और फ़ील्ड अलग-अलग अवधारणाएं हैं। एक संपत्ति किसी क्षेत्र में संग्रहीत या नहीं हो सकती है (सर्कल का क्षेत्र एक संपत्ति है, और वहां एक एरिया विधि हो सकती है, लेकिन आंतरिक रूप से इसे त्रिज्या से गणना की जा सकती है)। –

+0

@ एडम मैंने सोचा कि कक्षा के कार्यों को विधियों (निजी, सार्वजनिक, आदि) के रूप में जाना जाता है और कक्षा के चर को गुण/फ़ील्ड के रूप में संदर्भित किया जाता है। मुझे 100% यकीन नहीं है कि मैं आपका अनुसरण करता हूं उदाहरण हैं। आप कह रहे हैं कि circle.area और circle.getArea() सर्किल क्लास दोनों गुण हैं? यह इंगित करने के लिए धन्यवाद कि गुण और फ़ील्ड अलग हैं। –

3

दुख की बात है, नहीं, वहाँ नहीं जावा में बराबर भाषा स्तर के समर्थन है।

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

3

मैं गेटटर या सेटर नहीं मानता क्योंकि वे आपके मामले में कुछ भी नहीं करते हैं, कोड को और जटिल बनाते हैं। गेटर्स या सेटर्स के बिना यहां एक उदाहरण दिया गया है।

class Dummy { 
    public String name; 
    public Dummy(String name) { this.name = name; } 
} 

Dummy dummy = new Dummy("fred"); 
System.out.println(dummy.name);//getter, prints: fred 
dummy.name = "lolo";//setter 
System.out.println(dummy.name);//getter, prints: lolo 

IMHO चीजों को और अधिक जटिल बनाने की आवश्यकता नहीं है। ऐसा अक्सर होता है कि जटिलता जोड़ने से You-Aint-Gonna-Need-It

+0

IMHO आप गलत हैं। Encapsulation से पता चलता है कि सभी क्षेत्रों को निजी होना चाहिए, और फ़ील्ड तक पहुंचने के लिए गेटर और सेटर विधियां हैं। यदि आप अपनी डमी कक्षा के साथ एक जटिल आवेदन लिखते हैं, और एक दिन आपको यह सोचना है कि नाम खाली नहीं हो सकता है, तो जॉर्ज की कक्षा को चेक द्वारा फिर से लिखा जा सकता है। यदि आपको अपनी कक्षा में वही संशोधित करना है, तो आपको नाम फ़ील्ड का निजीकरण करना होगा, एक गेटर और एक सेटर लिखना होगा (जहां यह जांचना है कि नाम शून्य नहीं हो सकता है) और अपने सभी एप्लिकेशन को संशोधित करें जहां यह फ़ील्ड को संदर्भित करता है । –

1

सेटर्स और गेटर्स जोड़ने से पहले, यह पूछना अच्छा विचार हो सकता है कि आप ऑब्जेक्ट के आंतरिक डेटा को प्रश्न में क्यों उजागर कर रहे हैं।
मैं पता चलता है आप इस लेख को पढ़ने के - http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

+0

कुछ भी लें एलन होलब नमक के एक बड़े अनाज के साथ कहते हैं; वह एक encapsulation-as-data-hiding चरमपंथी है। यदि आप सिमुलेशन ऐप लिख रहे हैं, तो मैं सहमत हूं कि आप राज्य का पर्दाफाश नहीं करना चाहते हैं; लेकिन अन्य ऐप्स के लिए, डेटा-सुरक्षा (आपके डेटा में नियंत्रण में परिवर्तन) के रूप में encapsulation के बारे में सोचें, डेटा छिपाने के माध्यम से (दूसरों को यह जानने की अनुमति न दें कि आपके पास डेटा है) –

+1

मुझे लगता है कि कोई होल्ब को चरमपंथी कह सकता है, लेकिन होलब पॉइंट भी लाया जाता है यहोशू बलोच द्वारा, प्रभावी जावा आइटम देखना 13 - http://books.google.com/books?id=ZZOiqZQIbRMC&pg=PA63&lpg=PA63&dq=favor+immutability&source=bl&ots=UZOZ8thI62&sig=FwssZOJiYmMmxS3nATJpW4Xri-8&hl=en&ei=57wRSpf5BZfKtgfm-ImRCA&sa= एक्स और ओआई = book_result और सीटी = परिणाम और resnum = 2 # पीपीए 63, एम 1 – KingInk

3

एक आईडीई-स्वतंत्र तरीके Lombok, कि टिककर खेल, setters उत्पन्न करता है एक एनोटेशन आधारित पुस्तकालय, और यहां तक ​​कि equals() और hashcode() उपयोग करने के लिए है। यह संकलक के लिए करता है, लेकिन स्रोत फ़ाइल में नहीं, इसलिए आपको विधियों को देखने की ज़रूरत नहीं है, बस उनका उपयोग करें।

+0

भयानक डिजाइन (अजीब लाल, कई अलग और अनुपयुक्त फोंट), आसान उपकरण! धन्यवाद भयानक! –