शीर्षक के लिए खेद है, शायद बहुत सामान्य।एक्शनलिस्टर सर्वोत्तम प्रथाओं
मैं पहले से ही How to Write an Action Listener जावा द्वारा ट्यूटोरियल पढ़ता हूं और मैंने पहले से ही this question पढ़ा है, लेकिन मुझे अभी भी कुछ संदेह हैं: मैं सोच रहा था कि मुझे कौन सा समाधान एक ही समय में एक ही क्रिया करना है।
मैं उसी ActionListener
का पुन: उपयोग करना चाहता हूं, लेकिन मुझे इस बात पर यकीन नहीं है कि इसे सर्वोत्तम तरीके से कैसे प्राप्त किया जाए (कोड पठनीयता, कोड मैनेटेनिटी, प्रदर्शन और कोड शैली की अवधि में बोलना)।
सबसे पहले "मानक" कोड (जो मैं प्रयोग करेंगे अगर मैं कार्रवाई श्रोता पुन: उपयोग करने नहीं जा रहा हूँ): के बाद से यह एक गुमनाम आंतरिक है,
btnMenu.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
);
इस तरह से मैं कुछ भी पुन: उपयोग नहीं कर सकते Obv वर्ग ...
अब, मैं निम्नलिखित समाधान के बारे में सोच सकते हैं:
- स्टोर एक क्षेत्र में एक बेनामी इनर क्लास के लिए एक संदर्भ (कि सबसे अधिक संभावना
static final
हो जाएगा); ActionListener
इंटरफ़ेस लागू करने वाली एक नई कक्षा लिखें। समाधान 2 के लिएpublic static final MENU_ACTION_LISTENER = new ActionListener() { public void actionPerformed(ActionEvent e) { Navigator.showMenu(); } }; btnMenu.addActionListener(MENU_ACTION_LISTENER);
उदाहरण कोड: समाधान 1 के लिए
उदाहरण कोड
कहाँ स्टोर करने के लिए:
// package-private, only GUI-package classes should be able to use it. // most likely I won't ever need to subclass it, so why not making it final? final class MenuActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { Navigator.showMenu(); } } // now, wherever I need to use it: btnMenu.addActionListener(new MenuActionListener());
मैं दोनों समाधान के बारे में कुछ संदेह है बेनामी एक्शन श्रोताओं के संदर्भ? मेरे पास एक प्रकार की यूटिलिटी क्लास (उदा।
ActionListenersUtil
) हो सकती है, जहां सभी एक्शन श्रोताओं को स्टोर किया जाए, मैंstatic final
फ़ील्ड्स में पुन: उपयोग करना चाहता हूं, लेकिन मुझे यह पसंद नहीं है ... ऐसा लगता है कि मुझे खराब डिजाइन लगता है।यह अधिक भावना, शायद सबसे अच्छा Command Pattern इस प्रकार बनाता है ... मैं शुरू में संकुल के बारे में कुछ संदेह नहीं था ... मैं एक अलग पैकेज में सभी श्रोताओं (जीयूआई तत्वों के लिए
com.myapp.gui
और के लिएcom.myapp.gui.listeners
जैसे करना चाहते हैं श्रोताओं। लेकिन जब मैंने इसे लिखा तो मुझे एहसास हुआ कि मेरे पास कोई विकल्प नहीं है: एकमात्र जगह जहां यह समझ में आता है उसी पैकेज में है (क्योंकि वे पैकेज-निजी होना चाहिए), भले ही आदेश के लिए मेरे पास होगा उन्हें सभी को एक अलग पैकेज में रखना पसंद है। मुझे अभी भी कुछ संदेह है, क्योंकि जीयूआई के मामले में अधिकांश एक्शन श्रोताओं को पुन: प्रयोज्य भी किया जा सकता है; फिर भी यह एक ही पैकेज में रखना अच्छा विचार होगा?
एक और सवाल: क्या btnMenu.addActionListener(MENU_ACTION_LISTENER);
और btnMenu.addActionListener(new MenuActionListener());
बुला के बीच का अंतर (JVM, वर्ग लोड हो रहा है, वर्ग संकलन, स्मृति की अवधि प्रत्येक वर्ग, कचरा संग्रहण और इतने पर के कब्जे में बोल) है?
कृपया मदद करें, मैं अभी इतनी उलझन में हूं! :(
+1 यह आपको टेक्स्ट, आइकन, सक्षम स्थिति और उन सभी बटनों के अन्य गुणों को बदलने की क्षमता देता है जो 'एक्शन' एक ही समय में एकाधिक कॉल के बिना संलग्न होते हैं। इसके अलावा, इसे मेनू आइटम और साथ ही साथ जोड़ा जा सकता है। – Brian
+1000 अगर मैं कर सकता था ... ;-) –
@ ब्रायन बहुत अच्छी टिप्पणी। मैंने इसे अधिक पूर्ण बनाने के उत्तर में इसे कॉपी किया है – Robin