2013-01-31 43 views
10

免責聲明:我知道@Deprecated的含義和用途。@Deprecated對方法參數和局部變量有什麼意義?

@Deprecated註解的定義看起來像這樣用Java的源代碼:

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

我理解爲CONSTRUCTORFIELDTYPEMETHODPACKAGE目標值的目的。

但是,將方法參數或局部變量標記爲@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! 
    } 
} 

這是他們打算在未來實施的東西嗎?


FWIW,我在Ubuntu 12.04 64bit上使用JDK 1.7.0_11。無論從Eclipse還是命令行運行程序,結果都是一樣的。

編譯器並吐出警告爲正常用法@Deprecated,如使用java.util.Date類的棄用構造函數之一。只是爲了證明我沒有故障終端或設置,這裏是輸出:

$ 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

只是爲了好奇心,你正在使用哪種編譯器?而當你寫'//無警告'時,你是否在IDE中? – ThanksForAllTheFish

+0

我很努力去理解一個不贊成的方法和一個不贊成的參數可能意味着什麼...... – assylias

回答

7

是什麼意思標記方法參數或局部變量@Deprecated

它具有the same meaning as when applied to any other element:

註釋@Deprecated一種程序單元是一個程序員使用氣餒,通常是因爲它是危險的,或者是因爲存在更好的選擇。編譯器在非棄用代碼中使用或覆蓋不推薦使用的程序元素時發出警告。


爲什麼不編譯器省略爲過時的參數和字段Java 7中的警告?
Because that's exactly what the JLS (§ 9.6.3.6) dictates.

一個Java編譯器必須產生一個警告棄用當類型,方法,字段或構造,其聲明被註釋與註釋@Deprecated被使用(即重寫時,調用,或通過名稱來引用),除非:

  • 使用是其本身與註釋@Deprecated註釋的實體內;或

  • 該用法位於一個實體內,該實體被註釋爲禁止帶註釋的警告@SuppressWarnings("deprecation");或

  • 使用和聲明都在同一個最外層類中。

的局部變量聲明或參數聲明中使用@Deprecated註解沒有影響。

(強調)

+0

沒錯。但'當在方法參數或局部變量上使用'@ Deprecated'時,編譯器會警告在不推薦使用的程序元素被使用或在不被棄用的代碼中被覆蓋時,絕不會發生! – adarshr

+1

您必須看到Eclipse內部;我也看到了。但是,當我用javac編譯時,我確實收到警告。 –

+0

你確定,因爲我沒有。看我的編輯。 – adarshr

2

的JLS明確指出@Deprecation註釋局部變量忽略。看到馬特鮑爾的回答。

這是他們打算在未來實施的東西嗎?

我非常懷疑它。

  • 什麼,這可能意味着......除了其目前的含義非正式提醒實現者(也許風格檢查/ PMD/FindBugs的/等)的局部變量需要被移除。

  • 任何材料更改很可能會破壞目前使用註釋的人的源代碼兼容性。 Java維護者非常努力地避免破壞舊代碼。

+0

+1向後合規的非常好的一點。 – adarshr

相關問題