2010-09-29 7 views
10

इंटरफेस एनोटेशन मैं कोड का निम्न भाग करवाते हैं ठोकर खाई के साथ काम करते हुए (यह हाइबरनेट @NotNull एनोटेशन है):डिफ़ॉल्ट जावा में विधि वापसी मान

@Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) 
@Retention(value = RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy = {}) 
public @interface NotNull { 

    @Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) 
    @Retention(value = RetentionPolicy.RUNTIME) 
    @Documented 
    public @interface List { 

     public NotNull[] value(); 
    } 

    public String message() default "{javax.validation.constraints.NotNull.message}"; 

    public Class<?>[] groups() default {}; 

    public Class<? extends Payload>[] payload() default {}; 
} 

मैं default कीवर्ड के बारे में सोच रहा था/विधि में निर्माण परिभाषा, जिसे मैंने पहले कभी नहीं देखा है। जैसा कि मैंने समझा, यह आपको इस विधि (या एनोटेशन प्रॉपर्टी) के लिए डिफ़ॉल्ट मान परिभाषित करने देता है।

अब मैं इस निर्माण को सामान्य इंटरफेस पर लागू करने की कोशिश कर रहा था, लेकिन यह असफल रहा। इस संकलन विफल हो जाएगा:

public interface DefaultTest { 
    public String test() default "value"; 
} 

लेकिन यह काम करेगा:

public @interface DefaultTest { 
    public String test() default "value"; 
} 

तो मेरे सवाल है: default कीवर्ड एनोटेशन विशेष है? और यदि हां, सामान्य इंटरफेस परिभाषाओं में इस निर्माण का उपयोग करने के खिलाफ क्या बोलता है?

उत्तर

16

जावा 8 और उसके बाद

हाँ, डिफ़ॉल्ट कीवर्ड अब इंटरफेस पर इस्तेमाल किया जा सकता। अधिक जानकारी के लिए Oracle's docs देखें।

कार्यान्वयन आप जो सोच रहे थे उससे थोड़ा अलग है। यह होगा:

public interface DefaultTest { 
    default public String test() { 
     return "value"; 
    } 
} 

जावा 7 और पिछले

डिफ़ॉल्ट कीवर्ड केवल एनोटेशन के लिए इस्तेमाल किया जा सकता है।

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

public abstract class DefaultTest { 

    public String test() { 
    return "value"; 
    } 

} 
+1

एकाधिक इंटरफ़ेस विरासत सही समझ में आता है। इस पर ध्यान दिलाने के लिए धन्यवाद। – MicSim

+0

बाहर निकलता है कि आप वास्तव में प्रामाणिक थे। जावा 8 अब आपको वही करने देता है जो आप चाहते हैं! मैंने अपना जवाब अपडेट कर लिया है। – Pace

3

यहां 'डिफ़ॉल्ट' कीवर्ड एनोटेशन विशिष्ट नहीं है। इंटरफ़ेस विधियों के लिए डिफ़ॉल्ट कार्यान्वयन प्रदान करने के लिए जावा की यह विशेषता है। इस व्यवहार का

आवश्यकता: शुरू में मान लीजिए कि एक इंटरफेस वाहन सभी वाहन कार्यात्मक तरीकों का समर्थन करने के लिए परिभाषित किया गया था -

interface Vehicle { 
    void speed(); 

    ... 
    //other interface methods 
} 

अब इस वाहन इंटरफ़ेस को लागू करने वर्गों को लागू किया है उन सार तरीकों।

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

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

interface Vehicle { 
    void speed(); 

    ... 
    //other interface methods 

    //default method 
    default void flyingSpeed() { 
    System.out.println("Default flying speed"); 
    } 
} 

इस तरह से वाहन के पिछले मौजूदा वर्गों को इस विधि को लागू करने की आवश्यकता नहीं होगी।

अधिक जानकारी के लिए see यहां।