मुझे सिखाया जा रहा था कि जावा में मार्कर इंटरफ़ेस एक खाली इंटरफ़ेस है और इसका उपयोग संकलक या जेवीएम को संकेत देने के लिए किया जाता है कि इस इंटरफ़ेस को लागू करने वाले वर्ग की वस्तुओं को एक विशेष तरीके से व्यवहार किया जाना चाहिए, जैसे कि क्रमांकन, क्लोनिंग, आदि।
लेकिन हाल ही में मैंने सीखा है कि इसका वास्तव में कंपाइलर या जेवीएम से कोई लेना-देना नहीं है। उदाहरण के लिए, Serializableइंटरफ़ेस के मामले में , विधि writeObject(Object)का पता लगाने के लिए ObjectOutputStreamकुछ करना पसंद instanceOf Serializableहै कि क्या वर्ग तदनुसार लागू करता है Serializableऔर फेंकता है NotSerializableException। सब कुछ कोड में संभाला जाता है और यह एक डिज़ाइन-पैटर्न प्रतीत होता है, इसलिए मुझे लगता है कि हम अपने स्वयं के मार्कर इंटरफेस को परिभाषित कर सकते हैं।
अब मेरी शंका:
क्या 1 बिंदु में ऊपर उल्लिखित मार्कर इंटरफ़ेस की परिभाषा गलत है? हम फिर एक मार्कर इंटरफ़ेस कैसे परिभाषित कर सकते हैं?
और
instanceOfऑपरेटर का उपयोग करने के बजाय विधि कुछ ऐसा क्यों नहीं हो सकताwriteObject(Serializable)ताकि रनटाइम के बजाय एक संकलन-समय प्रकार की जाँच हो?मार्कर इंटरफेसेस की तुलना में एनोटेशन कैसे बेहतर हैं?
Serializableएनोटेशन बकवास है और@NonNullइंटरफ़ेस के रूप में बकवास है। मैं कहूंगा: एनोटेशन मार्कर + मेटाडेटा हैं। BTW: फॉरएफ्टनर ऑफ़ एनोटेशन्स XDoclet था, जिसका जन्म जावेदोक में हुआ था, जो एनोटेशन द्वारा मारा गया था।