2013-01-31 21 views
10

ZASTRZEŻENIE: Znam znaczenie i cel @Deprecated.Co oznacza wyrażenie @Deprecated dla parametrów metody i zmiennych lokalnych?

Definicja @Deprecated dopiskiem wygląda to w kodzie źródłowym Javy:

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

Rozumiem cel posiadające wartości docelowe CONSTRUCTOR, FIELD, TYPE, METHOD i PACKAGE.

Co to znaczy oznaczać parametr metody lub zmienną lokalną jako @Deprecated?

Co dziwne, poniższy przykład kompiluje się bez ostrzeżeń.

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! 
    } 
} 

Czy jest to coś, co mogliby wdrożyć w przyszłości?


FWIW, Używam JDK 1.7.0_11 na Ubuntu 12.04 64bit. Wynik jest taki sam, niezależnie od tego, czy uruchamiam program z Eclipse, czy z wiersza poleceń.

Kompilator nie wypluć ostrzeżenia dla normalnego wykorzystania @Deprecated, takie jak przy użyciu jednej z nieaktualnych konstruktorów klasy java.util.Date. Wystarczy udowodnić, że nie mam uszkodzonego terminala lub skonfigurować, tu jest wyjście:

$ 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

Tylko dla ciekawości, jakiego kompilatora używasz? a kiedy piszesz "// bez ostrzeżenia" jesteś w IDE? – ThanksForAllTheFish

+0

Trudno mi zrozumieć, co niezałożona metoda z przestarzałym argumentem może oznaczać ... – assylias

Odpowiedz

7

Co to znaczy, aby zaznaczyć parametr metoda lub lokalną zmienną jako @Deprecated?

Ma the same meaning as when applied to any other element:

Element Program adnotacją @Deprecated jest, że programiści są zniechęceni do korzystania, zwykle dlatego, że jest niebezpieczne, albo dlatego, że istnieje lepsza alternatywa. Kompilatory ostrzegają, gdy nieużywany element programu zostanie użyty lub nadpisany w niezaakceptowanym kodzie.


Dlaczego nie kompilator pominięcie ostrzeżenia o nieaktualnych parametrów i pól w Javie 7?
Because that's exactly what the JLS (§ 9.6.3.6) dictates.

Java kompilator musi wytwarzać ostrzeżenie amortyzacyjne gdy typ, sposób, pola lub konstruktora, którego zgłoszenie jest opatrzone adnotacją @Deprecated stosuje się (tjnadpisane, powoływać lub odwoływać przez nazwę), chyba że:

  • Zastosowanie znajduje się w jednostce, która sama opatrzone adnotacją @Deprecated; lub

  • Użycie znajduje się w obrębie jednostki, która jest opatrzona komentarzem w celu wyłączenia ostrzeżenia z adnotacją @SuppressWarnings("deprecation"); lub

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

Zastosowanie @Deprecated adnotacji na deklaracji zmiennej lokalnej lub w deklaracji parametru nie ma znaczenia.

(podkreślenie dodane)

+0

Dokładnie. Ale "Kompilatory ostrzegają, gdy nieaktualny element programu jest używany lub przesłonięty w nie-przestarzałym kodzie", nigdy nie dzieje się, gdy używasz '@ Przestarzałe' na parametry metody lub zmienne lokalne! – adarshr

+1

Musisz zobaczyć, że wewnątrz Eclipse; Widzę to samo. Kiedy jednak kompiluję z javakiem, otrzymuję ostrzeżenie. –

+0

Jesteś pewien, bo nie. Zobacz moją edycję. – adarshr

2

JLS wyraźnie stwierdza, że ​​adnotacja @Deprecation jest ignorowany na zmienne lokalne. Zobacz odpowiedź Matta Balla.

Czy jest to coś, co mogliby wdrożyć w przyszłości?

Bardzo w to wątpię.

  • Co to może oznaczać ... oprócz jego obecnym znaczeniu jako nieformalne przypomnienia implementor (a może styl warcaby/PMD/FindBugs/etc), że zmienna lokalna musi być usunięta.

  • Zmiana dowolnego materiału może zlikwidować zgodność ze źródłami dla osób, które obecnie używają adnotacji jak powyżej. Opiekunowie Javy bardzo starają się unikać łamania starego kodu.

+0

+1 Bardzo dobry punkt na zgodność wstecz. – adarshr

Powiązane problemy