2015-10-13 9 views
5

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

मैं इस जानकारी को उन गेटर्स के रूप में स्टोर कर सकता हूं जो स्थिरांक लौटाते हैं। उदाहरण के लिए:

public class Penguin implements Animal { 

    public boolean canWalk() { 
     return true; 
    } 

    public boolean canSwim() { 
     return true; 
    } 

    public boolean canFly() { 
     return false; 
    } 

    // implementation... 
} 

रन-टाइम की जांच तो है:

if (animal.canFly()) { 

    // Fly! 
} 

या मैं उपयोग कर सकते हैं "टैगिंग" इंटरफेस:

public class Penguin implements Animal, Flyer, Swimmer { 

    // implementation... 
} 

रन-टाइम की जांच तो है:

if (animal instanceof Flyer) { 

    // Fly! 
} 

के फायदे और नुकसान क्या हैं प्रत्येक दृष्टिकोण?

उत्तर

5

मार्कर इंटरफेस आधुनिक जावा में एंटी-पैटर्न का एक छोटा सा पैटर्न है, जो पहले के समय में आवश्यक था क्योंकि किसी वर्ग में सीधे मेटाडेटा जोड़ने का कोई तरीका नहीं था।

@Retention(RetentionPolicy.RUNTIME) 
@interface Flyer { 
} 

@Retention(RetentionPolicy.RUNTIME) 
@interface Swimmer { 
} 

@Flyer @Swimmer 
public class Penguin implements Animal { 
} 

और क्रम की जांच:: "आधुनिक" दृष्टिकोण एनोटेशन है

if(Animal.class.isAnnotationPresent(Flyer.class)) { 
    // fly! 
} 

आप अगर है सब आप जानना चाहते हैं एक Animal इस विशेषता है, तो इस दृष्टिकोण का उपयोग कर सकते हैं, कि उड़ान है और तैराकी क्षमता शुद्ध मेटाडाटा है।

आप क्या हासिल करने की कोशिश कर रहे हैं? मैं इस ओओपी को नहीं बुलाऊंगा, क्योंकि ओओपी दृष्टिकोण आमतौर पर क्षमताओं से पूछताछ नहीं करता है और ऑब्जेक्ट-विशिष्ट सशर्त तर्क निष्पादित नहीं करता है, यह बहुरूपता का उपयोग करना है।

+2

रनटाइम पर उपलब्ध होने के लिए आपको एनोटेशन इंटरफ़ेस के लिए पैरामीटर की आवश्यकता है। – Dariusz

+0

@Dariusz अच्छा पकड़ो! संपादित। – sh0rug0ru

+1

यह एक आम गलतफहमी है कि एनोटेशन मार्कर इंटरफेस के लिए एक प्रतिस्थापन है। _ प्रभावशाली जावा आइटम # 37: टाइप_ को परिभाषित करने के लिए मार्कर इंटरफेस का उपयोग करें, विशेष रूप से एनोटेशन पर मार्कर इंटरफेस के फायदे बताते हैं। – jaco0646

2

तरह या राज्य से संबंधित चलने/तैरने/उड़ाने की क्षमताएं चल रही हैं? कक्षा अंकन (दयालु) और संपत्ति (राज्य) के बीच यह वास्तविक अंतर है।

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

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

निष्कर्ष निकालने के लिए, Runnable कमांड जैसी स्थिर क्षमताओं क्लास मार्किंग पर भरोसा कर सकती हैं जहां गतिशील लोगों को राज्य पर भरोसा करना चाहिए।

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

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