2012-06-13 12 views
9

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

  1. कैसे JVM इस विशिष्ट व्यवहार का आह्वान करता है?
  2. अपना खुद का मार्कर इंटरफ़ेस कैसे लिखें? क्या आप मुझे समझने के लिए एक साधारण उपयोगकर्ता परिभाषित मार्कर इंटरफ़ेस दे सकते हैं?
  3. क्या मार्कर इंटरफ़ेस में विधियां संभव है?

कृपया इस समस्या को हल करने के लिए मुझे मार्गदर्शन करें।

+0

आप मार्कर इंटरफ़ेस क्यों लिखना चाहते हैं? यह अप्रचलित चीज है। _annotations _* का प्रयोग करें वैसे भी आप अपने "मार्कर इंटरफ़ेस" का उपयोग कैसे करेंगे –

+0

@ ओपी डी सर्कल - यह निश्चित रूप से अप्रचलित नहीं है, सबसे पहले और सबसे प्रमुख, मार्कर इंटरफेस चिह्नित प्रकार के उदाहरणों द्वारा लागू किए गए प्रकार को परिभाषित करता है; मार्कर एनोटेशन नहीं करते हैं। अधिक जानकारी के लिए प्रभावी जावा 2 संस्करण आइटम 37 पढ़ें। – Premraj

उत्तर

11
  1. क्रमबद्धता ObjectInputStream और ObjectOutputStream वर्गों द्वारा नियंत्रित किया जाता है। यदि किसी वर्ग में विशेष क्रमिकरण की आवश्यकता है, तो बनाने के तरीके API में उल्लिखित हैं। इन तरीकों का आह्वान करने के लिए प्रतिबिंब का उपयोग किया जाता है।

  2. वैसे ही आप कोई अन्य इंटरफ़ेस लिखेंगे।

  3. मार्कर इंटरफ़ेस में विधियों को रखने से आपको रोक नहीं रहा है।

अधिक आम बात अब annotations उपयोग करने के लिए एक ही मेटाडाटा मार्कर इंटरफेस प्रदान प्रदान करना है।

+0

: बहुत बहुत धन्यवाद ...मैं जानना चाहूंगा कि वे ऑब्जेक्टइनपूटस्ट्रीम क्लास से संबंधित कोड लिख रहे हैं ...? तो केवल मैं अपना खुद का मार्कर इंटरफ़ेस लिख सकता हूं जैसे कि serilizable ... – Saravanan

+0

सटीक लाइनों के बजाय उल्लिखित वर्गों के स्रोत के माध्यम से जाओ !! – Premraj

+3

@ सरवनन जेडीके ओपन सोर्स है। [ 'ObjectInputStream'] (http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectInputStream.java/?v=source)। [ 'ObjectOutputStream'] (http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectOutputStream.java/?v=source)। – Jeffrey

0

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

उदाहरण के लिए आपके पास मार्कर इंटरफ़ेस "सेव करने योग्य" है। आपके पास एक ऐसी प्रक्रिया है जो इस इंटरफ़ेस को लागू करने वाले सभी वर्गों को प्रतिबिंबित करती है (प्रतिबिंब के माध्यम से) और उसके बाद ऑपरेशन को सहेजती है।

2

विकिपीडिया लेख Marker interface pattern में बहुत अच्छी तरह से समझाया गया है, एक मार्कर इंटरफ़ेस मेटाडेटा का एक रूप है। क्लाइंट कोड यह जांच सकता है कि कोई ऑब्जेक्ट मार्कर इंटरफ़ेस का उदाहरण है और उसके अनुसार उसके (क्लाइंट के) व्यवहार को अनुकूलित करता है। यहाँ एक मार्कर इंटरफेस है:

public interface CoolObject { 
} 

तो कोड का परीक्षण कर सकते एक वस्तु एक CoolObject है कि क्या है और इसके साथ कुछ करना:

if (anObject instanceof CoolObject) { 
    addToCoolList((CoolObject) anObject); 
} 

Serializable इंटरफ़ेस जावा भाषा के हिस्से के रूप में परिभाषित किया गया है। आप उस स्तर पर व्यवहार को लागू नहीं कर सकते हैं।

आप मार्कर इंटरफ़ेस में विधियां जोड़ सकते हैं, लेकिन यह इंटरफेस के लिए अन्य वैचारिक उपयोगों के साथ मार्कर पैटर्न को मिश्रित करता है और भ्रमित हो सकता है। (क्या एक वर्ग इसे चिह्नित करने के प्रयोजनों के लिए इंटरफेस को कार्यान्वित कर रहा है, या उसके व्यवहार के लिए, या दोनों?)

जैसा कि विकिपीडिया लेख में बताया गया है, जावा में मार्कर इंटरफेस (और शायद चाहिए) annotations के साथ प्रतिस्थापित किया जा सकता है।चाहे या नहीं यह Serializable implementes

17
  • कैसे JVM इस विशिष्ट व्यवहार

ObjectOutputStream और ObjectInputStream आह्वान अपनी कक्षा की जाँच करेगा, Externalizable। यदि हां यह जारी रहेगा या अन्यथा NonSerializableException फेंक दिया जाएगा।

  • लिखने के लिए कैसे हमारे अपने मार्कर इंटरफ़ेस

किसी भी विधि के बिना एक अंतरफलक बनाएँ और है कि अपने मार्कर इंटरफेस है।

नमूना

public interface IMarkerEntity { 


} 

तो किसी भी वर्ग है जो इस इंटरफ़ेस आपके आवेदन के द्वारा डेटाबेस इकाई के रूप में ले जाया जाएगा लागू।

नमूना कोड:

public boolean save(Object object) throws InvalidEntityException { 
    if(!(object instanceof IMarkerEntity)) { 
     throw new InvalidEntityException("Invalid Entity Found, cannot proceed); 
    } 
    database.save(object); 
} 
  • इस मार्कर इंटरफ़ेस में तरीकों को शामिल करना संभव है?

Marker Interface Pattern के पूरे विचार "स्वीकार मैं कुछ कर रहा हूँ" और जब आप Serialzable के रूप में अपने वर्ग का प्रतीक तो सिस्टम डिफ़ॉल्ट प्रक्रिया, जैसे के साथ आगे बढ़ना होगा यह सिर्फ बताता है कि इस वर्ग के हो सकता है एक मतलब प्रदान करना है बाइट्स में परिवर्तित

+3

यह उत्तर –

2

हाँ हम एक निम्नलिखित हमारे अपने मार्कर interface..See बना सकते हैं ...

interface Marker{ 
} 

class MyException extends Exception { 
    public MyException(String s){ 
     super(s); 
    } 
} 

class A { 
    void m1() throws MyException{   
     if((this instanceof Marker)){ 
      System.out.println("successfull"); 
     } 
     else { 
      throw new MyException("Must implement interface Marker "); 
     }  
    } 
} 

public class CustomMarkerInterfaceExample extends A implements Marker 
{ // if this class will not implement Marker, throw exception 
    public static void main(String[] args) { 
     CustomMarkerInterfaceExample a= new CustomMarkerInterfaceExample(); 
     try { 
      a.m1(); 
     } catch (MyException e) { 

      System.out.println(e); 
     } 


    } 

} 
0

मार्कर इंटरफ़ेस कोई तरीका नहीं है। जावा में Serializable, Clonable & EventListner आदि जैसे अंतर्निहित मार्कर इंटरफ़ेस है जो JVM द्वारा समझा जाता है।

हम अपना खुद का मार्कर इंटरफ़ेस बना सकते हैं, लेकिन इसका JVM से कोई लेना-देना नहीं है, हम instanceOf के साथ कुछ चेक जोड़ सकते हैं।

  1. खाली इंटरफ़ेस

    interface Marker{ } 
    
  2. एक वर्ग लिखें बनाएँ और इंटरफेस

    class A implements Marker { 
        //do some task 
    } 
    
  3. Main वर्ग को लागू करता है मार्कर इंटरफ़ेस instanceof

    class Main { 
        public static void main(String[] args) { 
         A ob = new A()[ 
         if (ob instanceOf Marker) { 
          // do some task 
         } 
        } 
    } 
    
  4. जाँच करने के लिए
+1

है, तो आप अधिक ध्यान देना चाहेंगे, आप कोड लिखते हैं, क्योंकि पॉइंट 3 के लिए आपके कोड में कई गलतियां हैं। – Tom

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