2009-05-19 11 views
23

मान लें कि मेरे पास Foo एक इंटरफ़ेस लागू करने जैसे MouseListener है। MouseListener इंटरफ़ेस में पांच विधियां हैं लेकिन मैं केवल उनमें से एक को ओवरराइड करना चाहता हूं (mouseClicked())। क्या अन्य तरीकों को स्वरूपित करने का एक मानक, बेवकूफ तरीका है?क्या रिक्त विधियों के लिए जावा में एक मुहावरे है जो इंटरफ़ेस को संतुष्ट करने के लिए मौजूद है?

@Override 
public void mouseClicked(MouseEvent e) { 
    // (...) <-- actual code here 
} 

@Override 
public void mouseEntered(MouseEvent e) { 
    // Do nothing. Exists to satisfy MouseListener interface. 
} 

@Override 
public void mouseExited(MouseEvent e) { 
    // Do nothing. Exists to satisfy MouseListener interface. 
} 

@Override 
public void mousePressed(MouseEvent e) { 
    // Do nothing. Exists to satisfy MouseListener interface. 
} 

@Override 
public void mouseReleased(MouseEvent e) { 
    // Do nothing. Exists to satisfy MouseListener interface. 
} 

मैं इसे स्पष्ट है कि तरीकों जानबूझकर खाली कर रहे हैं के बजाय गलती से तो छोड़ दिया बनाने के एक प्रशंसक हूँ, लेकिन मैं सभी ऊर्ध्वाधर अंतरिक्ष के बारे में पागल नहीं हूँ:

मेरे झुकाव निम्नलिखित लिखने के लिए था मूल रूप से कुछ भी के लिए छोड़ दिया। मैं भी निम्न स्वरूप देखा है:

public void mouseClicked(MouseEvent e) { 
    // (...) <-- actual code here 
} 

public void mouseEntered(MouseEvent e) {} 
public void mouseExited(MouseEvent e) {} 
public void mousePressed(MouseEvent e) {} 
public void mouseReleased(MouseEvent e) {} 

मैं आम तौर पर इससे कोई समस्या नहीं है और मुझे लेखक की मंशा को समझते हैं, लेकिन जब (recommended) @Override एनोटेशन जोड़ रहे हैं यह वास्तव में बदसूरत हो जाता है।

मैं विशेष रूप से अनुभवी जावा कोडर नहीं हूं इसलिए मुझे लगा कि मैं पूछूंगा कि कोई सम्मेलन था या नहीं। विचार?

+1

आप MouseAdapter क्लास से अवगत हैं, है ना? http://java.sun.com/javase/6/docs/api/java/awt/event/MouseAdapter.html –

उत्तर

5

MouseAdapter उपयोग

+7

हालांकि यह उत्तर सही है, यह प्रश्न की भावना को संबोधित नहीं करता है जो किया जाना है जब एक इंटरफेस का केवल एक हिस्सा लागू किया जा रहा है। –

+6

वह कन्वेंशन के लिए पूछ रहा है, न कि इंटरफेस को कार्यान्वित करने के लिए। –

+0

एक माउसइवेंट श्रोता बनाने के लिए इस वर्ग को विस्तारित करें और ब्याज की घटनाओं के तरीकों को ओवरराइड करें। (यदि आप माउसलिस्टर इंटरफ़ेस को कार्यान्वित करते हैं, तो आपको इसमें सभी विधियों को परिभाषित करना होगा। यह सार वर्ग उन सभी के लिए शून्य विधियों को परिभाषित करता है, इसलिए आपको केवल उन ईवेंट के तरीकों को परिभाषित करना होगा जिनकी आप परवाह करते हैं।) Http: // java। sun.com/j2se/1.4.2/docs/api/java/awt/event/MouseAdapter.html –

8

मैं इसे उसी तरह तुम क्या करते हैं, अगर वहाँ कुछ भी नहीं थेरेस एक पंक्ति पर छोड़ दें। हो सकता है कि 'कार्यान्वयन एक-लाइनर' के बड़े ब्लॉक के शीर्ष पर एक टिप्पणी दें।

1

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

6

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

आम तौर पर, संक्षिप्त उत्तर 'नहीं', वहाँ कैसे खाली तरीकों दस्तावेज़ के लिए के लिए कोई मानक सम्मेलन है, हालांकि मैं आम तौर पर एक श्रोता के प्रयोजन के लिए सूचित किया है की तरह

@Override 
void foo() { 
    // No implementation necessary 
} 
1

कुछ का उपयोग करें कुछ घटनाएं यदि श्रोता इंटरफ़ेस में आपकी आवश्यकता से अधिक विधि कॉलबैक शामिल हैं, तो केवल उन लोगों को अनदेखा करें जिनकी आपको परवाह नहीं है। आपके मामले में MouseAdapter इस सटीक उद्देश्य के लिए डिज़ाइन किया गया था। UnsupportedOperationException फेंक दें क्योंकि कॉलर सबसे अधिक अपवाद की अपेक्षा नहीं कर रहा है। यह संभवतः श्रोता इंटरफेस के अनुबंध का उल्लंघन करता है क्योंकि प्रत्येक विधि को लागू करने की उम्मीद है।

+0

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

0

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

शायद सबसे महत्वपूर्ण बात यह स्पष्ट है कि आप इस विधि के लिए कोई कार्यान्वयन नहीं करना चाहते हैं। MouseAdapter के विशिष्ट मामले में, शायद आप UnsupportedOperationException फेंकने के आसपास नहीं जाना चाहते हैं, लेकिन आम तौर पर, यह शायद एक अच्छा संकेत है कि आप कार्यान्वयन प्रदान करने का इरादा नहीं रखते हैं।स्रोत कोड (या बेहतर, विधि प्रलेखन) में एक टिप्पणी यह ​​बताने के लिए कि आप इंटरफ़ेस को पूरी तरह कार्यान्वित क्यों नहीं कर रहे हैं, आमतौर पर आवश्यक है।

0

मुझे नहीं लगता कि यह विशेष रूप से मायने रखता है। अपनी व्यक्तिगत पसंद के लिए मैं उद्घाटन, जो देता है के बगल में बंद करने ब्रेस को देखने के लिए पसंद नहीं है:

public void mouseEntered(MouseEvent e) { 
} 

थोड़ा खाली है, लेकिन ठीक है। रिटर्न वैल्यू के मामले में हम इसे सुसंगत बना सकते हैं, जिसमें आपको [] शैली के साथ नहीं मिलता है।

लेकिन जब यह छोरों में दुर्लभ मामला की बात आती है, मैं वहाँ में एक अर्धविराम की तरह:

// Made up example. 
while (++i < len && str.charAt(i) != '\0') { 
    ; 
} 

कौन सा देना होगा:

public void mouseEntered(MouseEvent e) { 
    ; 
} 

catch खंड के मामले में, आप चाहते बेहतर टिप्पणी में एक अच्छा बहाना है (शायद एक बाधा छोड़ना)।

5

आम तौर पर, आप किस बारे में बात कर रहे हैं वह शून्य ऑब्जेक्ट पैटर्न का विस्तार है। आप एक नल ऑब्जेक्ट को निश्चित कर रहे हैं और केवल उन तरीकों को ओवरराइड करके इसे विस्तारित कर रहे हैं जिनकी आप परवाह करते हैं।

अपने जावाड्यूड बीन एनोटेशन (http://code.google.com/p/javadude/wiki/Annotations) में इसे स्वचालित करने के तरीके के उदाहरण के रूप में, आप निम्न की तरह कुछ कर सकते हैं। [नोट: मैं MouseListener के लिए ऐसा करने की अनुशंसा नहीं करता, क्योंकि MouseAdapter पहले से मौजूद है और आप इसे केवल उपclass कर सकते हैं ... निम्नलिखित अन्य बड़े इंटरफेस के लिए उपयोगी है जहां आप केवल कुछ चुनिंदा तरीकों को लागू करना चाहते हैं]

@Bean(nullObjectImplementations = @NullObject(type=MouseListener.class)) 
public class MyMouseHandler extends MyMouseHandlerGen { 
    public void mouseClicked(MouseEvent e) { 
     // your handling of a MouseClick 
    } 
} 

फिर आप क्लिक संभाल करने MyMouseHandler उपयोग कर सकते हैं =

नोट:। MouseAdapter एक JRE/JDK में वर्ग के नाम के लिए वास्तव में बुरा विकल्प था। यह गोफ एडाप्टर पैटर्न का एक उदाहरण नहीं है; यह वास्तव में एक माउस लिस्टनर का एक शून्य ऑब्जेक्ट कार्यान्वयन है।

Btw: आप विधि घोषणा के रूप में एक ही लाइन पर @Override डाल सकते हैं - आप

@Override public void mousePressed(MouseEvent e) { /* not needed */ } 
// et al 
0

हो सकता है आपके उदाहरण के लिए मैं इस जबकि इस सटीक प्रश्न के लिए खोज पाया। मैं स्क्रॉल पर उपयोग कर रहा हूं जहां मुझे स्क्रॉलस्टेट चेंज किया गया है लेकिन स्क्रॉल पर नहीं। मैं इस पर झुका रहा था:

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 
      int totalItemCount) { 
    return;   
} 

हालांकि, मुझे आपके द्वारा दिया गया दूसरा उदाहरण पसंद है (उसी रेखा पर ब्रेसिज़ के साथ)। यह कॉम्पैक्ट और साफ है और लगातार इस विचार को व्यक्त कर सकता है कि यह जानबूझकर खाली छोड़ दिया गया है।

संपादित करें:

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 
      int totalItemCount) {return;} 

यह एक मानकों का एक बहुत है, तो यह एक पंक्ति में के रूप में के रूप में अच्छा नहीं लगता है, लेकिन आप अंदाजा हो: यह है कि क्या मैं पर बसे है।

2

ऐसा करने के कई तरीके हैं। Oracle java conventions पी 6।4 (पेज 11) का कहना है कि खाली तरीकों की तरह

public void empty() {} 

दिखना चाहिए वहाँ भी Steve Yohanan द्वारा एक दस्तावेज 2003 चींटी में लिखा यह कहता है

public void empty() 
{ 
} 

हालांकि मैं "खाली के लिए किसी भी सम्मेलन नहीं मिला है है इंटरफेस स्टब के रूप में विधि "। तो एक निष्कर्ष के रूप में, ऐसा करने का कोई मानकीकृत तरीका नहीं है। कुछ टिप्पणी छोड़ना पसंद करते हैं, कुछ इसे सिंगल लाइन बनाना पसंद करते हैं, कुछ इसे रिक्त शरीर के साथ किसी अन्य विधि के रूप में लिखते हैं।

+0

वास्तव में ओपी जैसे कोडिंग सम्मेलनों के लिए एक लिंक प्रदान करने के लिए धन्यवाद। – amertkara

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

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