29

シナリオ:
Java 1.6

class Animal { 
    private String name; 
    ...  
    public String getName() { return name; }  
    ...
}

class CatDog extends Animal {
    private String dogName;
    private String catName;
    ...
    public String getDogName() { return dogName; }
    public String getCatName() { return catName; }
    public String[] getNames() { return new String[]{ catName, dogName }; }
    ...
    public String getName() { return "ERROR! DO NOT USE ME"; }
}

問題:
getName は意味がなく、この例では使用しないでください。@Deprecated アノテーションについて読んでいます。より適切な注釈方法はありますか?

質問:
A) この関数を使用するときに (実行前に) エラーを強制することは可能ですか?
B) 使用する注釈方法に対してカスタマイズされた警告/エラー メッセージを表示する方法はありますか? 理想的には、ユーザーが非推奨/エラー関数にカーソルを合わせているときです。

4

4 に答える 4

63

通常、新しいバージョンのソフトウェアによって廃止されたが、古いバージョンに依存するコードとの API 互換性のために保持しているメソッドには @Deprecated を使用します。getName は の他のサブクラスによってまだ積極的に使用されているため、このシナリオで使用するのに最適なタグであるかどうかはわかりませんが、クラスのユーザーにそのメソッドを呼び出すべきではないAnimalことを確実に警告します。CatDog

その関数が使用されているときにコンパイル時にエラーを発生させたい場合は、コンパイラ オプションを変更して、@Deprecated メソッドの使用を警告ではなくエラーと見なすことができます。もちろん、ライブラリを使用するすべての人がこのオプションを設定することを保証することはできません。また、言語仕様だけに基づいてコンパイル エラーを強制する方法はありません。からメソッドを削除してCatDogも、クライアントはそれを呼び出すことができます。これは、クライアントがスーパークラスからデフォルトの実装を呼び出すだけだからですAnimal(おそらく、まだそのメソッドを含めたいと考えています)。

ただし、ユーザーが非推奨のメソッドにカーソルを合わせたときに、カスタム メッセージを表示することは確かに可能です。Javadoc @deprecated タグを使用すると、メソッドが非推奨になった理由の説明を指定できます。ユーザーが Eclipse などの IDE でメソッドにカーソルを合わせると、メソッドの通常の説明の代わりにポップアップします。次のようになります。

/**
 * 
 * @deprecated Do not use this method!
 */
 @Deprecated
 public String getName() {
     throw new UnsupportedOperationException();
 }

(メソッドの実装で例外をスローして、ユーザーがコンパイル時に @Deprecated タグに気付かなかった場合でも、実行時に確実に気付くようにすることができることに注意してください)。

于 2012-07-13T02:37:16.130 に答える
18

非推奨とは、そのメソッドを今後使用すべきではなく、将来のリリースで削除される可能性があることを意味します。基本的にはまさにあなたが望むものです。

はい、誰かがメソッドを使用しようとしたときにコンパイルエラーを発生させる簡単な方法があります: メソッドを削除します - メソッドを使用しようとするコードのリンク時にエラーが発生します。下位互換性を破るには本当に十分な理由があります。それが実現する最も簡単な方法です。メソッド シグネチャを非互換にすることもできますが (常に可能です)、実際には機能する最も単純なソリューションが一般的に最適です。

誰かがメソッドにカーソルを合わせたときにカスタム メッセージが必要な場合は、javadoc を使用してください。まさにそれが目的です。

/**
     * @deprecated
     * explanation of why function was deprecated, if possible include what 
     * should be used.
     */
于 2012-07-13T02:25:47.507 に答える
3

非推奨は行くべき道です...警告ではなくエラーとして特定のものにフラグを立てるようにコンパイラーを構成することもできますが、エドワードが指摘したように、完全にクリーンアップする必要がないように、通常はメソッドを非推奨にしますこの時点でのすべての参照。

Eclipse でエラーと警告を構成するには、[ウィンドウ] -> [設定] に移動します。Java -> Compiler -> Errors/Warnings の下に、Deprecated APIs のセクションが表示されます。メソッドが非推奨になったときに、無視、警告、またはエラーをコンパイラに指示することを選択できます。もちろん、他の開発者と一緒に作業している場合は、コンパイラを同じように構成する必要があります。

于 2012-07-13T03:13:18.880 に答える