2016-06-03 5 views
10

नोट: मैं उम्र के पुराने सवाल नहीं पूछ रहा हूं कि अज्ञात वर्ग में बाहरी चर का उपयोग क्यों अंतिम घोषित किया जाना चाहिए।अनाम वर्गों में विधियों के लिए 'अंतिम' कीवर्ड जोड़ना कोई प्रभाव पड़ता है?

जब जावा में एक गुमनाम वर्ग बनाते समय, आप अतिरिक्त तरीकों और यदि आप चाहें जोड़ सकते हैं:

public final void internal() { ... } 

:

Runnable r = new Runnable() { 
    public void run() { 
     internal(); 
    } 

    public void internal() { 
     .. code .. 
    } 
}; 

हालांकि, जावा भी आप final के रूप में अतिरिक्त तरीकों घोषित करने के लिए अनुमति देता है मेरा प्रश्न है: क्या वे विधियां पहले से ही प्रभावी रूप से अंतिम नहीं हैं, और final कीवर्ड को जोड़ने से कोई प्रभाव पड़ता है?

+4

क्योंकि यह पार्सिंग को सरल बनाता है? – kennytm

+0

यदि आप उस वर्ग पर प्रतिबिंब का उपयोग करते हैं तो आप यह बताने में सक्षम होंगे कि विधि 'अंतिम' है या नहीं। –

+2

खैर, जावा आपको कक्षाओं में विधियों पर 'अंतिम' लिखने की अनुमति देता है जो स्वयं 'अंतिम' हैं, भले ही यह सख्ती से अनावश्यक है ... –

उत्तर

13

final methods के बारे में जावा विनिर्देश का कहना है:

एक private विधि और सभी तरीकों एक final वर्ग के भीतर तुरंत घोषित (§8.1.1.2) के रूप में यदि वे final कर रहे हैं, के बाद से यह असंभव है उन्हें ओवरराइड करने के लिए व्यवहार करते हैं।

और Anonymous Class Declarations से:

एक अनाम वर्ग हमेशा परोक्ष final (§8.1.1.2)।

इसलिए, एक गुमनाम वर्ग पहले से ही final है, जो अपने तरीकों final के सभी बनाता है। आप final संशोधक जोड़ सकते हैं लेकिन यह अनावश्यक है।


Sotirios Delimanolis द्वारा एक दिलचस्प टिप्पणी से पता चलता है कि प्रतिबिंब एपीआई वास्तव में एक गुमनाम वर्ग के लिए final संशोधक रिपोर्ट नहीं करेगा:

public class Main { 
    public static void main(String[] args) { 
     Main anon = new Main() {}; 
     System.out.println(Modifier.isFinal(anon.getClass().getModifiers())); // prints false 
    } 
} 

यह जाहिरा तौर पर एक ज्ञात बग (JDK-8129576) जो करने के लिए अनुसूचित है जावा 9 में तय किया जाए।

+0

संक्षिप्त और अच्छी तरह से संदर्भित उत्तर के लिए धन्यवाद! –

+1

[जेवीएम नियमों द्वारा नहीं खेलता है।] (Http://ideone.com/IyPWp8) या जो भी इसे संकलित करता है। –

+1

@SotiriosDelimanolis मैंने पाया [यह बग रिपोर्ट] (https://bugs.openjdk.java.net/browse/JDK-4777101) जो "कोई मुद्दा नहीं है" = /। – Tunaki

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