10

免責事項: の意味と目的を理解してい@Deprecatedます。

注釈の定義は、@DeprecatedJava のソース コードでは次のようになります。

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

CONSTRUCTORFIELDTYPEMETHODおよびの目標値を持つ目的を理解しています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!
    }
}

これは、彼らが将来実装しようとしているものですか?


FWIW、Ubuntu 12.04 64ビットでJDK 1.7.0_11を使用しています。プログラムをEclipseから実行してもコマンドラインから実行しても、結果は同じです。

コンパイラは、クラスの推奨されないコンストラクタの 1 つを使用するなど、の通常の使用に対して警告を吐き出します。端末やセットアップに問題がないことを証明するために、出力は次のとおりです。@Deprecatedjava.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
4

3 に答える 3

7

メソッドパラメータまたはローカル変数をマークするとはどういう意味@Deprecatedですか?

他の要素に適用した場合と同じ意味です

注釈@Deprecatedが付けられたプログラム要素は、プログラマーが使用することを思いとどまらせる要素です。これは通常、危険であるため、またはより適切な代替手段が存在するためです。非推奨のプログラム要素が非推奨でないコードで使用またはオーバーライドされると、コンパイラは警告を発します。


コンパイラがJava7で非推奨のパラメータとフィールドの警告を省略しないのはなぜですか?
それはまさにJLS(§9.6.3.6)が指示していることだからです。

Javaコンパイラは、宣言にアノテーションが付けられているタイプ、メソッド、フィールド、またはコンストラクタ@Deprecatedが使用された場合(つまり、オーバーライド、呼び出し、または名前で参照された場合)、非推奨の警告を生成する必要があります。

  • 使用は、それ自体が注釈@Deprecatedで注釈が付けられているエンティティ内で行われます。また

  • 使用は、注釈付きの警告を抑制するために注釈が付けられたエンティティ内で行われ@SuppressWarnings("deprecation")ます。また

  • 使用と宣言は両方とも同じ最も外側のクラス内にあります。

@Deprecatedローカル変数宣言またはパラメーター宣言でアノテーションを使用しても効果はありません。

(強調を追加)

于 2013-01-31T13:52:04.327 に答える
2

JLS は、@Deprecation アノテーションがローカル変数で無視されることを明示的に述べています。Matt Ballの回答を参照してください。

これは、彼らが将来実装しようとしているものですか?

私はそれを非常に疑っています。

  • それはどういう意味ですか...実装者(およびおそらくスタイルチェッカー/ PMD / FindBugs /など)への非公式のリマインダーとしての現在の意味とは別に、ローカル変数を削除する必要があります。

  • 重要な変更は、現在上記のアノテーションを使用している人々のソースの互換性を損なう可能性があります。Java の保守担当者は、古いコードを壊さないように懸命に努力しています。

于 2013-01-31T14:33:04.410 に答える