2013-01-31 14 views
10

अस्वीकरण: मुझे @Deprecated का अर्थ और उद्देश्य पता है।विधि पैरामीटर और स्थानीय चर पर @Deprecated मतलब क्या है?

@Deprecated एनोटेशन की परिभाषा जावा के स्रोत कोड में इस तरह दिखता है:

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) 
public @interface Deprecated { 
} 

मैं CONSTRUCTOR, FIELD, TYPE, METHOD और PACKAGE का लक्ष्य मान होने का उद्देश्य समझने।

हालांकि, विधि पैरामीटर या स्थानीय चर को @Deprecated के रूप में चिह्नित करने का क्या अर्थ है?

आश्चर्यजनक रूप से नीचे दिया गया उदाहरण किसी भी चेतावनी के बिना संकलित करता है।

interface Doable { 
    void doIt(@Deprecated Object input); 
} 

class Action implements Doable { 

    @Override 
    public void doIt(@Deprecated Object input) { 

     String string = String.valueOf(input); // no warning! 

     @Deprecated 
     String localVariable = "hello"; 

     System.out.println("Am I using a deprecated variable?" + localVariable); // no warning! 
    } 
} 

क्या यह भविष्य में लागू करने का इरादा रख सकता है?


एफडब्ल्यूआईडब्ल्यू, मैं उबंटू 12.04 64 बिट पर जेडीके 1.7.0_11 का उपयोग करता हूं। परिणाम वही है चाहे मैं ग्रहण या कमांड लाइन से प्रोग्राम चलाता हूं।

संकलक ऐसे java.util.Date वर्ग के पदावनत कंस्ट्रक्टर्स से एक का उपयोग के रूप में @Deprecated की सामान्य उपयोग के लिए चेतावनी थूक से बाहर है,।

$ javac com/adarshr/Test.java -Xlint:deprecation 
com/adarshr/Test.java:12: warning: [deprecation] Date(int,int,int) in Date has been deprecated 
     new Date(2013, 1, 31); 
     ^
1 warning 
$ 
$ javac -version 
javac 1.7.0_11 
+0

सिर्फ जिज्ञासा के लिए, आप किस कंपाइलर का उपयोग कर रहे हैं? और जब आप '// कोई चेतावनी' लिखते हैं तो क्या आप आईडीई के अंदर होते हैं? – ThanksForAllTheFish

+0

मैं यह समझने के लिए संघर्ष करता हूं कि बहिष्कृत तर्क के साथ एक गैर बहिष्कृत विधि का क्या अर्थ हो सकता है ... – assylias

उत्तर

7

क्या यह एक तरीका है पैरामीटर या @Deprecated के रूप में एक स्थानीय चर चिह्नित करने के लिए क्या मतलब है: बस साबित होता है कि मैं एक दोषपूर्ण टर्मिनल की जरूरत नहीं है या की स्थापना की, यहां उत्पादन है?

यह है the same meaning as when applied to any other element:

एक कार्यक्रम तत्व @Deprecated एनोटेट एक है कि प्रोग्रामर का उपयोग करने से हतोत्साहित किया जाता है, आम तौर पर क्योंकि यह खतरनाक, या क्योंकि एक बेहतर विकल्प मौजूद है है। कंपाइलर्स चेतावनी देते हैं जब एक बहिष्कृत प्रोग्राम तत्व का उपयोग किया जाता है या गैर-बहिष्कृत कोड में ओवरराइड किया जाता है।


क्यों संकलक पदावनत मापदंडों और जावा 7 में क्षेत्रों के लिए चेतावनी छोड़ नहीं करता है?
Because that's exactly what the JLS (§ 9.6.3.6) dictates.

एक जावा संकलक एक प्रतिवाद चेतावनी का उत्पादन होगा जब एक प्रकार, विधि, क्षेत्र, या निर्माता जिसका घोषणा एनोटेशन @Deprecated साथ टिप्पणी की जाती है प्रयोग किया जाता है (अर्थात, अधिरोहित लागू, या नाम से संदर्भित), जब तक:

  • उपयोग एक इकाई है जो अपने आप एनोटेशन @Deprecated साथ एनोटेट के भीतर है; या

  • उपयोग ऐसी इकाई के भीतर है जो एनोटेशन @SuppressWarnings("deprecation") के साथ चेतावनी को दबाने के लिए एनोटेट किया गया है; या

  • उपयोग और घोषणा दोनों एक ही बाहरी कक्षा के भीतर हैं। एक स्थानीय चर घोषणा पर या एक पैरामीटर घोषणा पर @Deprecated एनोटेशन के

उपयोग कोई प्रभाव नहीं है।

(जोर जोड़ा)

+0

बिल्कुल। लेकिन 'कंपाइलर्स चेतावनी देते हैं कि जब बहिष्कृत प्रोग्राम तत्व का उपयोग किया जाता है या गैर-बहिष्कृत कोड में ओवरराइड किया जाता है' तब कभी नहीं होता जब आप विधि पैरामीटर या स्थानीय चर पर '@ बहिष्कृत' का उपयोग करते हैं! – adarshr

+1

आपको ग्रहण के अंदर देखना होगा; मैं वही देखता हूं। जब मैं जावैक के साथ संकलित करता हूं, हालांकि, मुझे चेतावनी मिलती है। –

+0

क्या आप निश्चित हैं, क्योंकि मैं नहीं करता हूं। मेरा संपादन देखें। – adarshr

2

JLS स्पष्ट रूप से कहा गया है कि @Deprecation एनोटेशन स्थानीय चर पर ध्यान नहीं दिया जाता। मैट बॉल का जवाब देखें।

क्या यह भविष्य में लागू करने का इरादा रख सकता है?

मुझे बहुत संदेह है।

  • इसका क्या मतलब हो सकता है ... अलग अपने वर्तमान अर्थ से implementor (और शायद शैली चेकर्स/PMD/FindBugs/आदि) है कि स्थानीय चर निकालने की आवश्यकता के लिए एक अनौपचारिक चेतावनी के रूप में।

  • कोई भी सामग्री परिवर्तन उन लोगों के लिए स्रोत संगतता तोड़ने की संभावना है जो वर्तमान में ऊपर के रूप में एनोटेशन का उपयोग करते हैं। पुराना कोड तोड़ने से बचने के लिए जावा रखरखाव बहुत मेहनत करते हैं।

+0

+1 बहुत अच्छा बिंदु। – adarshr

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