2012-10-28 12 views
5

Sto cercando di utilizzare lo @Deprecated annotation. La documentazione @Deprecated dice che: "I compilatori avvisano quando un elemento del programma deprecato viene utilizzato o sovrascritto nel codice non deprecato". Penserei che questo dovrebbe scatenarlo, ma non è così. javac versione 1.7.0_09 e compilato usando e non usando -Xlint e -deprecation.Perché l'annotazione @Deprecated non sta attivando un avviso del compilatore su un metodo?

public class TestAnnotations { 

    public static void main(String[] args) 
    { 
     TestAnnotations theApp = new TestAnnotations(); 
     theApp.thisIsDeprecated(); 
    } 

    @Deprecated 
    public void thisIsDeprecated() 
    { 
     System.out.println("doing it the old way"); 
    } 
} 

Edit: per il commento del GD1 sotto per quanto riguarda solo funzionare se il metodo è in un'altra classe, ho aggiunto una seconda classe. E lo fa WARN sulla chiamata a theOldWay():

public class TestAnnotations { 

    public static void main(String[] args) 
    { 
     TestAnnotations theApp = new TestAnnotations(); 
     theApp.thisIsDeprecated(); 
     OtherClass thatClass = new OtherClass(); 
     thatClass.theOldWay(); 
    } 

    @Deprecated 
    public void thisIsDeprecated() 
    { 
     System.out.println("doing it the old way"); 
    } 
} 

class OtherClass { 

    @Deprecated 
    void theOldWay() 
    { 
     System.out.println("gone out of style"); 
    } 


} 

L'avvertimento:

/home/java/TestAnnotations.java:10: warning: [deprecazione] theOldWay() in OtherClass è stato deprecato

thatClass.theOldWay(); 
      ^

1 avvertimento

+1

ATTENZIONE: Sto solo supponendo. Forse nessun avviso deprecato viene generato a meno che non si chiami il metodo deprecato da un'altra classe. Ipotesi casuale. – gd1

+1

@ gd1 no. La deprecazione non attiva l'avviso.Devi gestire la logica di deprecazione nel tuo framework/applicazione –

risposta

5

Dal Java Language Specification:

Un Java compilatore deve produrre un avviso deprecazione quando viene utilizzato un tipo, metodo, campo, o costruttore la cui dichiarazione viene annotato con l'annotazione @deprecated (cioè sovrascritti , invocato, o fatto riferimento per nome), a meno che:

  • l'utilizzo è all'interno di un'entità che è essa stessa annotato con l'annotazione @deprecated; oppure

  • L'utilizzo è all'interno di un'entità annotata per sopprimere l'avviso con l'annotazione @SuppressWarnings ("deprecazione"); oppure

  • L'uso e la dichiarazione sono entrambi nella stessa classe più esterna.

Il vostro esempio è un esempio dell'ultima condizione: si sta utilizzando solo il metodo deprecato dalla stessa classe più esterno come il metodo deprecato.

+0

Grazie. Penso che dovrebbero aggiungere tali informazioni a http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Deprecated.html. – Scooter

+0

ahaha avevo quasi ragione :) – gd1

0

Depre Non sempre genera avvisi. Devi gestire la logica di deprecazione nel tuo framework/applicazione.

Da 1.5 JavaDoc:

NOTA: Il linguaggio Java Specification richiede compilatori ad emettere avvisi quando si utilizzano classi, metodi o campi contrassegnati con l'annotazione @deprecated. I compilatori non sono richiesti dalle specifiche del linguaggio Java per emettere avvisi quando si accede a classi, metodi o campi contrassegnati con il tag Javadoc @deprecated, sebbene i compilatori Sun lo facciano attualmente. Tuttavia, non vi è alcuna garanzia che il compilatore Sun emetta sempre tali avvertimenti.

+0

Il testo che hai citato contraddice la tua risposta: * La specifica del linguaggio Java richiede ai compilatori di emettere avvisi quando vengono utilizzate classi, metodi o campi contrassegnati con l'annotazione @Deprecated *. Quindi il compilatore * è richiesto * per attivare un avviso. –

+0

"... Tuttavia, non vi è alcuna garanzia che il compilatore Sun rilasci sempre tali avvisi .." –

+1

gli avvisi facoltativi si trovano nel deprecato ** tag javadoc **, non nell'annotazione Java deprecata **. –

Problemi correlati