2012-10-28 10 views
5

Próbuję użyć @Deprecated annotation. Dokumentacja @Deprecated mówi, że: "Kompilatory ostrzegają, gdy nieaktualny element programu jest używany lub przesłonięty w nie-przestarzałym kodzie". Myślę, że to powinno go uruchomić, ale tak się nie stało. javac w wersji 1.7.0_09 i skompilowany przy użyciu i nie używając -Xlint i -deprecation.Dlaczego adnotacja @Deprecated nie uruchamia ostrzeżenia kompilatora dotyczącego metody?

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: za komentarzu GD1 poniżej traktując ją tylko działać, jeśli metoda jest w innej klasie, dodałem drugą klasę. I robi WARN na wezwanie do 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"); 
    } 


} 

ostrzeżenie:

/home/java/TestAnnotations.java:10: ostrzeżenie: [deprecation] theOldWay() w OtherClass została zaniechana

thatClass.theOldWay(); 
      ^

1 ostrzeżenie

+1

OSTRZEŻENIE: Po prostu zgaduję. Być może nie ma przestarzałego ostrzeżenia, chyba że wywołasz nieaktualną metodę z innej klasy. Losowe zgadywanie. – gd1

+1

@ gd1 no. Wycofanie nie wyzwala ostrzeżenia.Musisz zarządzać logiką Deprecation w swojej strukturze/aplikacji –

Odpowiedz

5

Od Java Language Specification:

Java kompilator musi produkować ostrzeżenie Deprecation gdy stosowany jest typ, metoda, pole, lub konstruktor, którego deklaracja jest odnotowany z adnotacji @Deprecated (tj przesłonięte , wywoływana lub odwołuje nazwie), chyba że:

  • Zastosowanie znajduje się podmiot, który sam jest opatrzone adnotacją @Deprecated; lub

  • Użycie znajduje się w obrębie jednostki, która jest opatrzona komentarzem, aby wyłączyć ostrzeżenie za pomocą adnotacji @SuppressWarnings ("wycofanie"); lub

  • Użycie i deklaracja należą do tej samej najbardziej zewnętrznej klasy.

Twój przykład jest przykładem ostatniego warunku: jesteś tylko przy użyciu przestarzałej metody z tej samej klasy peryferyjnego jako przestarzałe metody.

+0

Dzięki. Myślę, że powinni dodać te informacje do http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Deprecated.html. – Scooter

+0

ahaha Miałem prawie rację :) – gd1

0

Depre kation Nie zawsze wyzwala ostrzeżenia. Musisz zarządzać logiką Deprecation w swoim frameworku/aplikacji.

Od 1.5 JavaDoc:

UWAGA: Specyfikacja języka Java wymaga kompilatory do wydawania ostrzeżeń podczas ćwiczenia, metody lub pola oznaczone @Deprecated adnotacji są używane. Kompilatory nie są wymagane przez specyfikację języka Java do generowania ostrzeżeń, gdy dostępne są klasy, metody lub pola oznaczone znacznikiem @deprecated Javadoc, chociaż kompilacje firmy Sun obecnie to robią. Jednak nie ma gwarancji, że kompilator firmy Sun zawsze będzie wyświetlał takie ostrzeżenia.

+0

Cytowany tekst jest sprzeczny z twoją odpowiedzią: * Specyfikacja języka Java wymaga kompilatorów do generowania ostrzeżeń, gdy używane są klasy, metody lub pola oznaczone adnotacją @Deprecated *. Zatem kompilator jest * wymagany *, aby wywołać ostrzeżenie. –

+0

"..Jednak nie ma gwarancji, że kompilator firmy Sun będzie zawsze wyświetlał takie ostrzeżenia." –

+1

opcjonalne ostrzeżenia dotyczą wycofanego ** tagu javadoc **, a nie adnotacji "Przestarzałe ** Java" **. –

Powiązane problemy