2008-11-24 14 views
17

मुझे आश्चर्य है कि क्या मुझे जावा बीन्स के बारे में कुछ याद आ रहा है। मुझे अपनी ऑब्जेक्ट्स को जितना संभव हो सके कन्स्ट्रक्टर में उतना ही प्रारंभ करना पसंद है और कम से कम म्यूटेटर हैं। बीन्स सीधे इसके खिलाफ जाते हैं और आम तौर पर घबराहट महसूस करते हैं। बीन्स के रूप में मेरी वस्तुओं को नहीं बनाकर मैं किस क्षमताओं को याद कर रहा हूं?जावा बीन्स: मुझे क्या याद आ रही है?

उत्तर

13

ऐसा लगता है जैसे आप सही रास्ते पर हैं। यह आप नहीं हैं जो जावा बीन्स के बिंदु को याद कर रहे हैं, यह अन्य प्रोग्रामर हैं जो उनका दुरुपयोग कर रहे हैं।

जावा बीन्स विनिर्देश को विज़ुअल टूल के साथ उपयोग करने के लिए डिज़ाइन किया गया था। विचार यह था कि एक एप्लिकेशन डिज़ाइनर ऑब्जेक्ट का एक उदाहरण इंटरैक्टिव रूप से कॉन्फ़िगर करने में सक्षम होगा, फिर कॉन्फ़िगर (या कोड के लिए कोड जेनरेट) कॉन्फ़िगर करें, ताकि इसे रनटाइम पर पुनर्निर्मित किया जा सके; इरादा यह था कि इसे रनटाइम पर उत्परिवर्तित नहीं किया जाएगा।

दुर्भाग्यवश, बहुत से डेवलपर्स accessors violate encapsulation को समझ में नहीं आते हैं।वे वस्तुओं के बजाय structs का उपयोग करें। उन्हें किसी वर्ग के डेटा सदस्यों पर निर्भरता रखने वाले अन्य वर्गों, यहां तक ​​कि अन्य पैकेजों के साथ कुछ भी गलत नहीं दिखता है।

बेशक, आपको सामान्य रूप से अपनी वस्तुओं के उदाहरणों को कॉन्फ़िगर करने की आवश्यकता होगी। यह सिर्फ इतना है कि यह किसी प्रकार की कॉन्फ़िगरेशन सुविधा के माध्यम से किया जाना चाहिए। यह एक निर्भरता इंजेक्शन कंटेनर, एक "बीनबॉक्स" शैली दृश्य उपकरण हो सकता है, या बस हाथ से लिखा गया JSON, XML, या गुण फ़ाइलों को पढ़ सकता है। कुंजी यह है कि रनटाइम पर ये वस्तुएं प्रभावी रूप से अपरिवर्तनीय होती हैं; ग्राहक सिर्फ अपने परिचालन का आह्वान करते हैं, वे अपनी संपत्तियों तक नहीं पहुंचते हैं।

+1

होलब encapsulation की परिभाषा का पालन करता है जिसे मैं "डेटा छिपाने" कहता हूं। मैं "डेटा सुरक्षा" पसंद करता हूं।गेम यह जानने के बारे में है कि आपका डेटा कब और कैसे बदला जाता है। जब तक डेटा निजी है, तब तक आप परिवर्तनों के नियंत्रण में हैं। उस बिंदु पर, क्या मायने रखता है कि आप इसे अपरिवर्तनीय चाहते हैं या नहीं। –

+0

प्रकारों के बीच युग्मन को कम करने से कोड पठनीयता और रखरखाव बहुत आसान हो जाता है। होलब और मेरे अपने अचूक अनुभव जैसे अधिकारियों ने मुझे सिखाया है कि वस्तु गुणों पर बाह्य निर्भरता अनावश्यक जटिलता का लक्षण हैं। आमतौर पर एक आसान, क्लीनर विकल्प होता है। – erickson

1

बीन्स इस तरह से कॉन्फ़िगर किए गए हैं ताकि स्वचालित उपकरण बीन्स बना और संशोधित कर सकें। वे जरूरी नहीं कि वे महान डिजाइन पैटर्न हों।

इन उपकरणों के उदाहरण:

Hibernate
JMX

+0

निश्चित रूप से। क्या स्वचालित उपकरण (serialization के अलावा) का उपयोग करने के लायक हैं? उदाहरण? धन्यवाद! –

+0

ईमानदारी से .... मुझे कोई जानकारी नहीं है। – jjnguy

+0

एक अच्छा उदाहरण हाइबरनेट होगा, इसे गुणों और सेटर्स की आवश्यकता होती है ताकि संपत्तियों को जारी रखा जा सके। –

7

मैं अपने वस्तुओं संभव के रूप में निर्माता में के रूप में ज्यादा प्रारंभ करते हैं और mutators की एक न्यूनतम संख्या के लिए पसंद करते हैं।

अपरिवर्तनीय वस्तुओं का पक्ष एक बुद्धिमान विकल्प है। हालांकि सेम का लाभ यह है कि ढांचे/उपकरण/पुस्तकालय एक विशेष इंटरफ़ेस को लागू करने के लिए बिना किसी कक्षा के गुणों को रनटाइम पर निर्धारित कर सकते हैं।

उदाहरण के लिए, मान लें कि आपके व्यक्ति सेम का एक संग्रह है, और प्रत्येक सेम जैसे नाम, उम्र, ऊंचाई, आदि के रूप में गुण है

आप नाम से सेम के इस संग्रह सॉर्ट कर सकते हैं (उदाहरण के लिए) का उपयोग निम्नलिखित कोड:

Collection<Person> myCollection = // initialise and populate the collection 
Comparator nameCompare = new BeanComparator("name"); 
Collections.sort(myCollection, nameCompare); 

BeanComparator वर्ग जानता है कि कैसे प्रत्येक वस्तु से "नाम" संपत्ति को निकालने के लिए, क्योंकि जावा बीन्स का पालन किया है, तो आप बख्शा रहे हैं अर्थात जैसे एक अंतरफलक को लागू करने की "भूमि के ऊपर":

interface Nameable { 
    public String getName(); 
    public void setName(String name); 
} 

स्प्रिंग एमवीसी का एक और उदाहरण एक बीन है जो अनुरोध यूआरएल पैरामीटर स्टोर करता है। यह इस तरह एक वेब नियंत्रक (के रूप में Struts में एक 'एक्शन' कहा जाता है) में परिभाषित किया जा सकता है:

public ModelAndView searchUsers(UserSearchCriteria criteria) { 
    // implementation omitted 
} 

क्योंकि UserSearchCriteria, एक JavaBean होने के लिए करता है, तो अनुरोध URL एक पैरामीटर जैसे maxItems=6 शामिल होने की उम्मीद है, स्प्रिंग ढांचा 'जानता है' कि यह हस्ताक्षर

void setMaxItems(int maxItems); 

संक्षेप में के साथ एक विधि फोन करना चाहिए, JavaBeans (आमतौर पर एक उपकरण या रूपरेखा के द्वारा) बस एक साधारण सम्मेलन जो एक वर्ग के गुणों कार्यावधि में गतिशील रूप से खोज की जा करने की अनुमति देता है , जब प्राथमिकता को जानना असुविधाजनक/असंभव होता है जो गुण प्रदान किए जा सकते हैं।

+1

बीनकंपेटरेटर बुरा है। प्रतिबिंब डिजाइन-समय और ढांचे के लिए है, न कि एक प्रकार के लूप के दिल के लिए। – erickson

2

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

लंबे और बहुत पहले, मैं एक जावा संपादक लिखता हूं जिसमें टेक्स्ट स्ट्रिंग का प्रतिनिधित्व करने वाला एक सरल "डेटा बेस" होता है, और इसमें "आर्किटेक्चर प्लग" होता है जो बीन्स का उपयोग करता है। आप एक बीन स्टोरेज बिन से बीन खींचकर और संपादक पर छोड़कर संपादक को व्यवहार जोड़ सकते हैं; एक बार ऐसा करने के बाद, व्यवहार (कहें, कर्सर पर वर्णों को स्थानांतरित करने के लिए सीएनटीएल-टी) संपादक में स्वचालित रूप से उपलब्ध था। बीन्स के पास एक ज्ञात इंटरफ़ेस था - वे जानते थे कि कंटेनर को इसकी डेटा संरचना के लिए कैसे पूछना है, और एक doSomething() विधि --- और कंटेनर को क्लास फ़ाइल को गतिशील रूप से लोड करना, ऑब्जेक्ट को तुरंत चालू करना और इसकी पहुंच सेट करना था डेटाबेस।

वैसे, यह वास्तव में सच नहीं है कि एक्सेसर्स encapsulation का उल्लंघन करते हैं; हालांकि यह सच है कि सिर्फ इसलिए कि आपके पास सदस्य है, इसलिए को की आवश्यकता नहीं है ताकि इसके लिए विधियां सेट कर सकें। JavaBean spec इस पर थोड़ा अस्पष्ट है; बिंदु उन चीजों के लिए गेटर्स और सेटर्स प्रदान करना है जिन्हें वस्तुओं "अनुबंध" में होना आवश्यक है।

आत्मनिरीक्षण और प्रतिबिंब भाषा में जोड़ा गया और वास्तव में समझने के बाद, उन सम्मेलनों की आवश्यकता कुछ हद तक कम हो गई; प्रारंभिक जावा में, आपको विधियों को खोजने के लिए एक सम्मेलन की आवश्यकता थी।

3

मैं इस विचार को साझा करता हूं कि उत्परिवर्तन को कम करना एक अच्छी बात है। जैसा कि पहले से ही बताया गया है, जावाबीन का लाभ यह है कि ढांचे द्वारा उन्हें संभालना आसान है।

"दोनों दुनिया" का सर्वश्रेष्ठ पाने के लिए, मुझे लगता है कि Builder pattern का उपयोग करने के लिए एक अच्छा विकल्प है, बिल्डर को जावाबीन मानक का अनुपालन करने के लिए थोड़ा संशोधित करना। इसलिए, यदि आपको एक फ्रेमवर्क कार्यक्षमता की आवश्यकता है जिसके लिए आपकी कक्षा जावाबीन मानक का अनुपालन करती है, तो आप बिल्डर को वास्तविक वर्ग के बजाय उपयोग कर सकते हैं।

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