जावा में इंटरफ़ेस और @interface के बीच क्या अंतर है?


306

यूनिवर्सिटी में 90 के दशक के अंत में JBuilder का उपयोग करने के बाद से मैंने जावा को नहीं छुआ है, इसलिए मैं थोड़ा सा संपर्क से बाहर हूं - किसी भी दर पर मैं इस सप्ताह एक छोटे से जावा प्रोजेक्ट पर काम कर रहा हूं, और मेरी आईडीई के रूप में Intellij IDEA का उपयोग कर रहा हूं , मेरे नियमित .Net विकास से गति में बदलाव के लिए।

मुझे लगता है कि इसमें इंटरफेस और @interfaces जोड़ने का समर्थन है, एक @interface क्या है, और यह एक सामान्य इंटरफ़ेस से कैसे भिन्न होता है?

public interface Test {
}

बनाम

public @interface Test {
}

मैंने थोड़ी खोज की है, लेकिन @interface के संदर्भ में उपयोगी जानकारी का एक बड़ा सौदा नहीं मिल सका है।

जवाबों:


322

@ प्रतीक एक एनोटेशन प्रकार परिभाषा को दर्शाता है।

इसका मतलब है कि यह वास्तव में एक इंटरफ़ेस नहीं है, बल्कि एक नया एनोटेशन प्रकार है - जिसका उपयोग फ़ंक्शन संशोधक, जैसे @override के रूप में किया जाता है

विषय पर इस javadocs प्रविष्टि देखें ।


7
बहुत धन्यवाद, जानकर अच्छा लगा। तो @interface को कॉल करने का औचित्य क्या था, बल्कि तब कहें @annotation I आश्चर्य .. एक अनावश्यक रूप से अतिभारित शब्द की तरह लगता है।
बिटरकोडर

5
ट्यूटोरियल और JLS एक एनोटेशन के लिए एक खास तरह का इंटरफ़ेस है। इस विषय पर बहुत अधिक चर्चा नहीं हुई है, लेकिन javarunner.blogspot.com/2005/01/annotations-in-java-15.html बताते हैं कि एनोटेशन एनोटेशन इंटरफ़ेस और @ और इंटरफ़ेस का एक अंतर्निहित विस्तार है एक नियमित इंटरफ़ेस से एक साथ अंतर करने के लिए उपयोग किया जाता है। आप एनोटेशन के लिए जेएसआर विनिर्देश को भी पढ़ना चाह सकते हैं।
डेविडवेलरी

1
@Bittercoder डॉक्स का उल्लेख करते हैं: "कीवर्ड इंटरफ़ेस साइन (@) (@ = AT, एनोटेशन प्रकार के अनुसार) से पहले है"। Thats सभी तर्क मैं wrt नामकरण पा सकते हैं।
शैशव

111

इंटरफेस:

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

@ उद्धरण: (एनोटेशन प्रकार)

नीचे दिए गए उदाहरण को लें, जिसमें बहुत सारी टिप्पणियां हैं:

public class Generation3List extends Generation2List {

   // Author: John Doe
   // Date: 3/17/2002
   // Current revision: 6
   // Last modified: 4/12/2004
   // By: Jane Doe
   // Reviewers: Alice, Bill, Cindy

   // class code goes here

}

इसके बजाय, आप एनोटेशन प्रकार की घोषणा कर सकते हैं

 @interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

जो तब एक वर्ग को एनोटेट कर सकता है:

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {

// class code goes here

}

पुनश्च: कई टिप्पणियां कोड में टिप्पणियों को प्रतिस्थापित करती हैं।

संदर्भ: http://docs.oracle.com/javase/tutorial/java/annotations/declaring.html


11
अच्छी व्याख्या
पैट बी

2
यह वास्तव में उपयोगी था। मुझे नहीं पता था कि जावा ऐसा कर सकता है।
जय सिदरी

पिछले उत्तर में यह लिंक शामिल था जो कि यह जानकारी कहां से आई है। मुझे इस विषय के बारे में अधिक जानकारी प्राप्त करना उपयोगी लगा। docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS

1
सबसे अच्छे और पूर्ण उत्तरों में से एक (अभी तक स्पष्ट) मैं स्टैकओवरफ़्लो पर देख रहा हूं।
मिस्टर डी

32

interfaceकीवर्ड इंगित करता है कि आप जावा में एक पारंपरिक इंटरफ़ेस वर्ग की घोषणा कर रहे हैं। कीवर्ड एक नई टिप्पणी का प्रकार घोषित करने के लिए प्रयोग किया जाता है।
@interface

वाक्य-विन्यास के विवरण के लिए एनोटेशन पर docs.oracle ट्यूटोरियल देखें । JLS
देखें यदि आप वास्तव में क्या मतलब है के विवरण में प्राप्त करना चाहते हैं ।@interface


18

interface: एक वर्ग के लिए अनुबंध को परिभाषित करता है जो इसे लागू करता है

@interface: एक एनोटेशन के लिए अनुबंध को परिभाषित करता है


8

जावा प्रोग्रामिंग भाषा में इंटरफ़ेस एक अमूर्त प्रकार है जो एक व्यवहार को निर्दिष्ट करने के लिए उपयोग किया जाता है जिसे कक्षाओं को लागू करना होगा। वे प्रोटोकॉल के समान हैं। इंटरफ़ेस कीवर्ड का उपयोग करके इंटरफेस घोषित किए जाते हैं

@interface का उपयोग अपने स्वयं के (कस्टम) जावा एनोटेशन बनाने के लिए किया जाता है। एनोटेशन को किसी जावा वर्ग या इंटरफ़ेस की तरह ही अपनी फ़ाइल में परिभाषित किया जाता है। यहाँ कस्टम जावा एनोटेशन उदाहरण है:

@interface MyAnnotation {

    String   value();

    String   name();
    int      age();
    String[] newNames();

}

यह उदाहरण MyAnnotation नामक एनोटेशन को परिभाषित करता है जिसमें चार तत्व होते हैं। @Interface कीवर्ड पर ध्यान दें। यह जावा कंपाइलर को संकेत देता है कि यह जावा एनोटेशन परिभाषा है।

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

उपरोक्त एनोटेशन का उपयोग करने के लिए, आप इस तरह कोड का उपयोग कर सकते हैं:

@MyAnnotation(
    value="123",
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {


}

संदर्भ - http://tutorials.jenkov.com/java/annotations.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.