2010-05-15 30 views
5

यह एक काफी व्यक्तिपरक प्रश्न हो सकता है, लेकिन शायद नहीं। मेरे एप्लिकेशन में फॉर्मों का एक गुच्छा शामिल है जो उपयोगकर्ता को अलग-अलग समय पर प्रदर्शित होते हैं। प्रत्येक रूप अपने आप का एक वर्ग है। आम तौर पर उपयोगकर्ता एक बटन पर क्लिक करता है, जिसने एक नया फॉर्म लॉन्च किया है।जावा प्रतिबिंब उपयुक्तता

मुझे लगता है कि इन बटनों बनाता है एक सुविधा समारोह है, तो आप इस तरह इसे कहते:

buildButton("button text", new SelectionAdapter() { 
    @Override 
    public void widgetSelected(SelectionEvent e) { 
     showForm(new TasksForm(args...)); 
    } 
    }); 

मैं कई बार इस दर्जनों करते हैं, और यह एक SelectionAdapter हर बार बनाने के लिए होने वास्तव में बोझिल है।

buildButton("button text", TasksForm.class, args...); 

कहाँ आर्ग:

सच सब मैं बटन को पता है के लिए की जरूरत है क्या वर्ग है कि क्लिक रहा है और क्या तर्क निर्माता देने के लिए दृष्टांत के लिए, तो मैं एक समारोह है कि मैं इस के बजाय की तरह फोन बनाया है ऑब्जेक्ट्स की मनमानी सूची है जिसे आप सामान्य रूप से कार्यप्रणाली को तुरंत चालू करने के लिए उपयोग कर सकते हैं।

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

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

+0

मैं प्रतिबिंब के साथ जाऊंगा। –

उत्तर

3

हाँ, आमतौर पर प्रतिबिंब फेंक दिया जाता है लेकिन कुछ मामलों में यह काफी उपयोगी हो सकता है। मैं कोड पढ़ने की सराहना करता हूं जिसे मैं ज़िबियन छोटी चीज़ों के बिना काफी जल्दी पच सकता हूं।

0

समस्या प्रति प्रतिबिंब नहीं है। आधुनिक ढांचे हर समय प्रतिबिंब का उपयोग करते हैं। और यह सभी प्रकार की चीजों को करने के लिए एनोटेशन का उपयोग करने के लिए कूल्हे है, जिसे आम तौर पर प्रतिबिंब की आवश्यकता होती है।

हालांकि, आपके मामले में, क्यों न तुम सिर्फ कार्य करें:

buildButton("button text", 
     new SelectionAdapterImplementation(new TaskForm(args))) 

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

+0

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

+0

ठीक है, आप सही हैं। इसके बाद प्रतिबिंब के साथ जाएं, या इसके बजाय कार्यफॉर्म ऑब्जेक्ट पास करें। – Artefacto

+0

मैंने तदनुसार पोस्ट संपादित किया है। – Artefacto

0

आपने अपनी कक्षा को लेने के लिए अपने buildButton(String, SelectionAdapter) को संशोधित किया है जिस पर आप प्रतिबिंबित करेंगे। मैं इकट्ठा करता हूं कि अब आप अपनी संशोधित विधि में एक नया SelectionAdapter बना रहे हैं और फिर कक्षा के नाम पर प्रतिबिंबित कर रहे हैं, एक उदाहरण बना रहे हैं और इसे showForm(arg) में पास कर रहे हैं। मुझे लगता है कि यह जाने की जरूरत से कहीं अधिक कदम है।

इसके बजाय, आप इसे showForm(arg) की आवश्यकता के किसी भी वर्ग का उदाहरण ले सकते हैं। कुंजी के लिए आपके arglist में final बहस करने के लिए होगी, और आप इसे अपने अज्ञात वर्ग में उपयोग करने में सक्षम होंगे।

+1

क्योंकि फ़ॉर्म एक उपयोगकर्ता इंटरफ़ेस घटक है, इसलिए जब मैं बटन बनाता हूं, तो मैं इसे तुरंत चालू नहीं कर सकता, मुझे बटन क्लिक होने तक प्रतीक्षा करना है, इसलिए चयन एडाप्टर – jsn

0

एक वैकल्पिक तरीका यह है कि प्रत्येक फॉर्म में एक स्थिर विधि है जो फ़ॉर्म बनाता है जो एक बटन देता है। लेकिन प्रतिबिंब शायद बेहतर होगा।

1

यदि मैं सही ढंग से समझता हूं, तो आप बहस के लिए विभिन्न प्रकार के बटन कार्यान्वयन (फॉर्म) के साथ एक ऑपरेशन (createButton) निष्पादित करना चाहते हैं। यह बिल्कुल ठीक लगता है जैसे आपको बहुरूपता की आवश्यकता है।

मेरा सुझाव है कि आप प्रतिबिंब भूल जाएं और इन फ़ॉर्मों को एक सामान्य इंटरफेस के तहत बनाएं। मान लीजिए कि interface Form { //some methods here }

अपने सभी रूपों आम इंटरफ़ेस को लागू करना होगा और इन तरीकों बटन के निर्माण के लिए आवश्यक हैं करते हैं। तो अगर आप एक प्रपत्र वस्तु है, तो आप इसे createButton(Form formObject){...}

को होती है, तो सभी SelectionAdapter फोन एक showForm विधि है पारित कर सकते हैं, तो आप इसे आम interface Form को जोड़ सकते हैं और सिर्फ एक फार्म वस्तु के लिए इस विधि आह्वान। इस प्रकार आपको कई अज्ञात वर्गों को बनाने की आवश्यकता नहीं है, बल्कि केवल एक और इसे "फॉर्म" ऑब्जेक्ट के साथ तुरंत चालू करने की आवश्यकता नहीं है।

तो आपको इन कक्षाओं के लिए बहुरूपता और अच्छी तरह से चुने गए इंटरफेस की आवश्यकता है।

यदि आपको फॉर्म ऑब्जेक्ट्स (उनके कन्स्ट्रक्टर अलग-अलग) बनाने में बड़ी समस्या है, तो आपको केवल MyFormBuilder बनाने पर विचार करना चाहिए जो केवल निर्माण को संभालता है। निर्माता के पास createInstance() विधि या getInstance() विधि होगी जो सभी काम करेगा।

मेरे सुझाव के साथ

आप 1 SelectionAdapter वर्ग कार्यान्वयन होगा, तो आप आम इंटरफेस के साथ वस्तुओं गुजर जाएगा और प्रतिबिंब से परहेज किया जाएगा, MyClass.class तर्क गुजर और इतने पर।

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