2009-08-18 21 views

उत्तर

5

क्योंकि कभी-कभी, यह वास्तव में समझ में आता है अगर किसी प्रकार की कुछ संपत्ति को एक प्रकार के रूप में उपयोग किया जा सकता है - Serializable दिमाग में आता है। मैं इस तरह एक विधि करते हैं:

public void save(Object data){ ... } 

... तुम सच में नहीं पता है कि data कैसे सहेज लिया जाएगा। वीएम serialization? बीन संपत्ति serialization? कुछ होमब्रीड योजना? जबकि अगर आप इसे इस प्रकार लिख:

public void save(Serializable data){ ... } 

... यह काफी स्पष्ट है (यदि केवल ObjectOutputStream के डिजाइनर इस संभावना का इस्तेमाल किया था!)। कभी-कभी जब आप मेटा-डेटा को प्रकारों में जोड़ना चाहते हैं तो एनोटेशन का उपयोग करना समझ में आता है, लेकिन इस मामले में, मैं एक टैगिंग इंटरफेस के लिए बहस करता हूं।

1

इसका उपयोग किसी वर्ग की कुछ संपत्ति का उल्लेख करने के लिए किया गया था (जैसे सीरियलज़ेबल शो, कि कक्षा को क्रमबद्ध करने की अनुमति है)। अब एनोटेशन यह काम कर सकता है।

+0

नहीं, एनोटेशन मार्कर इंटरफेस के लिए एक स्थानापन्न नहीं हैं। – skaffman

+1

@ स्काफमैन: क्या यह एक इंटरफ़ेस की तुलना में एनोटेशन की जांच करना मुश्किल है, जो आपको कहता है कि 'एनोटेशन मार्कर इंटरफेस के लिए प्रतिस्थापन नहीं है'? –

+0

कोई कक्षाओं के अलावा कोड को एनोटेट कर सकता है। कोई तर्क के साथ एनोटेशन का भी उपयोग कर सकता है। उदाहरण के लिए, JSR 305 '@ ScriptAssert' सत्यापन एनोटेशन लें। –

6

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

+0

यह एकमात्र भूमिका मार्कर इंटरफ़ेस प्ले है। – adatapost

+0

क्या यह है? मुझे लगता है कि एक टैगिंग इंटरफ़ेस को विस्तारित करने के लिए संकलन-समय पर टाइप-चेकिंग प्रदान कर सकते हैं जो केवल उन ऑब्जेक्ट्स को स्वीकार करते हैं जिनके प्रकार टैगिंग इंटरफ़ेस का विस्तार है। उदाहरण के लिए EventListenerList.add पर देखें। –

6

मार्कर इंटरफेस एनोटेशन बनाम का सवाल बलोच की "प्रभावी जावा" में बताया गया है, और उस खंड का हिस्सा गूगल पुस्तकों here

+0

+1 - सामान्य रूप से ब्लोच, इसे अच्छी तरह से बताता है और @ मेंमेन्थ के उत्तर पर मेरी टिप्पणी/प्रश्न का उत्तर देता है। –

0

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

0

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

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

0

टैगिंग इंटरफेस कोई सार तरीकों के अंदर के साथ इंटरफेस रहे हैं, वे वर्ग जो उन्हें लागू करता है के लिए एक डेटा प्रकार जोड़ने के लिए और अन्य इंटरफेस के लिए एक माता पिता इंटरफ़ेस

public interface name {} 
public interface john1 {} 
public interface john2 {} 
public interface Demo extends john1 , john2 , name {} 
(विशेष रूप से इंटरफेस में कई विरासत के साथ) होने के लिए उपयोग किया जाता है

** जब JVM नाम इंटरफ़ेस देखता है, तो यह पता लगाएगा कि डेमो एक विशिष्ट सेनारियो डालेगा।

0

मैं भी जोड़ना होगा आप एक उदाहरण के मालिकाना हक को प्रतिबंधित करने के टैगिंग इंटरफेस का उपयोग कर सकते हैं:

interface IFlumThing; 
interface IFlooThing; 

class BaseThing {...} 

class FlumThing extends BaseThing implements IFlumThing {}; 
class FlooThing extends BaseThing implements IFlooThing {}; 

class Flum { 
    addThing(IFlumThing thing){...}; 
} 

class Floo { 
    addThing(IFlooThing thing){...}; 
} 
संबंधित मुद्दे