2009-12-15 23 views
52

जावा में गेटर्स और सेटर्स बनाने का कोई बेहतर मानक तरीका है?जावा गेटर्स और सेटर्स

यह स्पष्ट हर चर के लिए getters और setters को परिभाषित करने के लिए काफी वर्बोज़ है। क्या एक बेहतर मानक एनोटेशन दृष्टिकोण है?

करता स्प्रिंग कुछ इस तरह है?

यहां तक ​​कि सी # गुण भी हैं।

+16

शायद यह नहीं है कि आप क्या सुनना चाहते हैं लेकिन अधिकांश आईडीई उन्हें आपके लिए उत्पन्न कर सकते हैं। –

+0

प्रश्न के वसंत भाग का जवाब देने के लिए: नहीं, वास्तव में नहीं। इसके अलावा, कुछ दिनों के लिए "प्रोग्रामिंग" एक्सएमएल के बाद, आप फिर से साफ, संक्षिप्त गेटर्स और सेटर्स कोडिंग की खुशी के लिए प्रार्थना करेंगे :) –

+0

अगर मैं गलत हूं तो मुझे सही करें लेकिन आपको अभी भी सी # गुण लिखना होगा? ऐसा नहीं है कि वे निहित हैं और आपको केवल उन्हें लिखना होगा यदि आप बुनियादी पढ़ने/लिखने के लिए एक परिवर्तनीय व्यवहार का विस्तार करना चाहते हैं। गेटर्स और सेटर्स पर उनके पास एकमात्र चीज यह है कि यह उन्हें एक साथ रखती है। – David

उत्तर

18

ग्रहण में एक संदर्भ मेनू विकल्प है जो आपके लिए इन्हें स्वतः उत्पन्न करेगा, क्योंकि मुझे यकीन है कि कई अन्य आईडीई करते हैं।

+1

यदि आप मुझे नीचे वोट करने जा रहे हैं, कम से कम एक कारण प्रदान करें। – Ascalonian

+2

वास्तव में सबसे अच्छा समाधान नहीं है, लेकिन यह वही है जो हम सीमित हैं। – WhyNotHugo

+2

जब भी मैं खेतों के समूह के साथ कुछ बदलता हूं, तो मैं केवल गेटर्स और सेटर्स को हटा देता हूं और ग्रहण को उन सभी को पुन: उत्पन्न करता हूं। यह शोर है। – gtrak

3

अधिकांश IDEs कोड पैदा करने के लिए एक शॉर्टकट प्रदान (जैसे ग्रहण: सही क्लिक करें -> स्रोत -> जनरेट Getters & Setters), हालांकि मुझे पता है यह शायद नहीं जवाब आप के लिए देख रहे हैं।

कुछ आईओसी ढांचे आपको गुणों को एनोटेट करने की अनुमति देते हैं ताकि उन्हें ढांचे के संदर्भ में उपयोग किया जा सके। टेपेस्ट्री आईओसी, और नवीनतम वसंत, मुझे लगता है (लेकिन यह उपयोग ढांचे द्वारा उपयोग करने के लिए सीमित है)

1

हाँ, आप भाग्य से बाहर हैं। ग्रोवी उन्हें आपके लिए उत्पन्न करता है, लेकिन मानक जावा में कोई पासा नहीं है। यदि आप ग्रहण का उपयोग करते हैं तो आप generate them pretty easily, साथ ही हैशकोड() और बराबर() फ़ंक्शन उत्पन्न कर सकते हैं।

58

मुझे यकीन नहीं है कि आप इसे 'मानक' मानेंगे, लेकिन Project Lombok इस समस्या को संबोधित करता है। वे जावा की अधिकांश वर्बोसिटी को प्रतिस्थापित करने के लिए एनोटेशन का उपयोग करते हैं।

कुछ लोगों को इस तरह के ग्रूवी या स्काला के रूप में वैकल्पिक जावा भाई भाषाओं, देख रहे हैं। मुझे डर है कि इसमें कुछ साल लगेंगे- अगर जेएसआर जावा में उचित रूप से "ठीक" करने के लिए "मानकीकृत" तरीका बताता है। http://cafe.elharo.com/java/why-java-doesnt-need-properties-it-already-has-them/

मुझे लगता है कि गुण एक शॉर्टकट हैं, लेकिन यह अधिक

+8

+1: लंबोक एक अच्छा जोड़ा है, और हैशकोड, बराबर और टूस्ट्रिंग का भी ख्याल रख सकता है .. बेवकूफ डेटा कक्षाओं के लिए एक मूल्य के लायक .. – Tim

+2

1 लंबवत के रूप में लंबोक को +1, लेकिन अनिवार्य रूप से आईडीई विशिष्ट होने के लिए -1। कोई अन्य आईडीई और आपको कोड को सजाने में त्रुटियों का एक बड़ा हिस्सा मिलता है क्योंकि आईडीई नहीं जानता कि क्या हो रहा है। मुझे पूरी तरह से यकीन नहीं है कि यह डिबगर्स के साथ कैसे काम करता है। –

+1

यह मेवेन के साथ भी ठीक काम करता है, और उन्होंने अभी एक डी-लोम्बोक विकल्प जोड़ा जो लोम्बोक के संदर्भ के बिना स्रोत कोड उत्पन्न करता है। – Tim

3

यहाँ विषय के बारे में एक दिलचस्प लेख है गेटर/सेटर को प्रतिस्थापित किया जाना है और ऑटो पूर्ण (Ctrl + स्पेस) को कॉल करना है, यह आपको गेटर या सेटर उत्पन्न करने का विकल्प देगा। यह आपको एक कन्स्ट्रक्टर उत्पन्न करने का विकल्प भी देगा। एक "संपत्ति" कीवर्ड की तरह कुछ भी -

+1

मैंने डेल्फी में कुछ सालों का विकास किया। मैं हमेशा डेल्फी की बेहतरीन सुविधाओं में से एक गुण मानता हूं। मैं हमेशा उदास था कि जावा में यह सुविधा नहीं है। एंडर्स हेजल्सबर्ग ने सी # में गुण बनाए और अब एमएस लोगों के पास है और हम नहीं करते हैं। यह एक "छोटी" सुविधा हो सकती है लेकिन कुछ भी जो कोड पर कटौती करता है त्रुटियों पर कटौती करता है और समझ में आता है। –

+1

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

2

NetBeans के साथ, बस मिलता है या सेट जहां टाइप करना आरंभ कोई वास्तविक महत्वपूर्ण विशेषता की तुलना में थोड़ा सुविधा है:

+0

ग्रहण में कुछ समान है। –

+0

और इंटेलिजे आईडीईए भी करता है। यह 3 प्रमुख जावा आईडीई बनाता है जिनका उपयोग आप समस्या के आसपास काम करने के लिए कर सकते हैं। –

1

कोई बेहतर तरीका है कि भाषा का हिस्सा है नहीं है।

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

तुम भी बस सार्वजनिक सदस्यों के रूप में चर का पर्दाफाश हो सकता है। हालांकि, सड़क के नीचे यह संभवतः आपको चोट पहुंचाने के लिए वापस आ जाएगा, जब आप सत्यापन तर्क जोड़ने का निर्णय लेते हैं।

हालांकि, एक अंतिम विचार: जब तक आपकी कक्षाओं को डेटा स्थानांतरित करने के लिए उपयोग नहीं किया जाता है, तो शायद उन्हें अपनी आंतरिक स्थिति का खुलासा नहीं करना चाहिए। आईएमओ, गेटर्स और सेटर्स के साथ "व्यवहार" कक्षाएं कोड गंध हैं।

2

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

गुण:

case class Person(var name:String, 
        var age:Int); 
val p = Person("John", 4) 
p.name 
p.name = "Charlie" 
p.name 

और उत्पादन:

defined class Person 
p: Person = Person(John,4) 
res7: String = John 
res8: String = Charlie 
+1

प्रौद्योगिकी का परिवर्तन। – Sylar

+0

तकनीकी रूप से जावा स्कैला का सबसेट है, इस प्रकार समस्या को संभवतः इस दृष्टिकोण का उपयोग करके हल किया जा सकता है। –

+4

मैं स्कैला पसंद करने में आपके साथ हूं (और इसलिए आपको 0 पर वापस ले लिया है) लेकिन "क्या आपने स्कैला की कोशिश की है?" थोड़ा सा पूछ रहा है। स्कैला जावा के पास गुजरने जैसा दिखता है, लेकिन मतभेद इतने बड़े हैं कि मैंने थोड़ी देर के लिए "जावा में स्कैला कोड" करने की कोशिश की और छोड़ दिया। हालांकि गेटर्स/सेटर्स को खोने में खुशी होती है, स्कैला को ठोस प्रतिबद्धता की आवश्यकता होती है। –

0

के रूप में getters/setters दोहराए वर्बोज़ कोड उत्पन्न करने के लिए आईडीई का काम है कि

+3

मैं असहमत नहीं हूं, लेकिन मुझे लगता है कि भाषा में कमजोरी का संकेत है जब कोड पीढ़ी को दोहराए जाने वाले कार्यों को करने की आवश्यकता होती है। यदि आईडीई आपके लिए ऐसा करने के लिए पर्याप्त स्मार्ट है, तो भाषा भी होनी चाहिए! –

+0

आईडीई ऐसा करने के लिए पर्याप्त स्मार्ट नहीं है, यह कोड उत्पन्न करता है अगर केवल अगर आप गेटर्स और/या सेटर्स प्रदान करने का निर्णय लेते हैं, और केवल वांछित आवृत्ति चर के लिए। डिफ़ॉल्ट रूप से सार्वजनिक रूप से घोषित नहीं होने पर डिफ़ॉल्ट रूप से सभी परिवर्तनीय पठनीय/संशोधित नहीं होते हैं। वर्बोजिटी के बारे में, जावा इन चर के सरल पढ़ने/संशोधित से अधिक प्रदान करता है, लेकिन चर के अनुरूप मान को संशोधित करने या वापस करने से पहले कुछ तर्क कर सकता है, फिर केवल तभी जब आप निर्णय लेते हैं। – user225486

+0

इस बिंदु पर आप अपने स्वयं के जवाब का विरोध कर रहे हैं। आप कह रहे हैं कि यह दोहराए गए वर्बोज कोड उत्पन्न करने के लिए आईडीई को बताने के लिए उपयोगकर्ता का काम है। निश्चित रूप से, यह ठीक है कि यह कैसे काम करता है, और मुझे लगता है कि यह बहुत बदसूरत है। डेल्फी, रुबी और अन्य भाषाएं आपको सरल गेटर्स और सेटर्स को स्वत: जेनरेट करने के लिए सरल कीवर्ड का उपयोग करने की अनुमति देती हैं, जबकि * आपको * परीक्षण, साइड इफेक्ट्स, एब्स्ट्रैक्शन या अन्य चाहें जो आप चाहते हैं, जोड़ने की स्वतंत्रता देते हैं। –

0

उत्पन्न करने के लिए अपने आईडीई का उपयोग करें यह आपके लिए है और आपके पास प्राप्तकर्ता/सेटर्स की मात्रा को कम करने का प्रयास करें - आप संभावित रूप से अपरिवर्तनीयता के अतिरिक्त लाभ का आनंद लेंगे।

मुझे गुणों के लिए सी # वाक्यविन्यास पसंद है, मुझे लगता है कि यह सुंदर और साफ है, और बहुत साफ है।

0

ठीक है, एक विकल्प सार्वजनिक क्षेत्रों से इतना डर ​​नहीं है। सरल वर्गों के लिए जिन्हें आप जानते हैं, वे प्राप्त करने और सेट पर हुड के तहत कभी भी सत्यापन या अतिरिक्त काम नहीं करेंगे, सार्वजनिक क्षेत्रों को कम बॉयलरप्लेट की आवश्यकता होती है, जो वाक्य रचनात्मक रूप से अच्छे हैं, और अधिक कुशल हैं।

+1

वे अधिक कुशल नहीं हैं क्योंकि हॉटस्पॉट जानता है कि गेटर्स और सेटर्स को इनलाइन कैसे करें – gtrak

6

मैंने कुछ एनोटेशन बनाए हैं जो ग्रहण-विशिष्ट नहीं हैं।

http://code.google.com/p/javadude/wiki/Annotations

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

package sample; 

import com.javadude.annotation.Bean; 
import com.javadude.annotation.Property; 
import com.javadude.annotation.PropertyKind; 

@Bean(properties={ 
    @Property(name="name"), 
    @Property(name="phone", bound=true), 
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST) 
}) 
public class Person extends PersonGen { 
} 

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

आनंद लें! - स्कॉट

0

यदि आप emacs का उपयोग करते हैं तो यह आपके लिए यह करता है कि एक emacs मैक्रो को परिभाषित करना संभव हो सकता है। वहाँ कोई emacs गुरु वहाँ बाहर? :)

3

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

2

इसके @RooJavaBean एनोटेशन के साथ स्प्रिंग रू प्रोजेक्ट भी है। इसमें @RooToString और @RooHashCodeEquals या ऐसा कुछ भी है। यह पृष्ठभूमि में एक AspectJ फ़ाइल को उचित तरीकों से उत्पन्न करता है।

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