10

Javaプログラミングの場合、@ Deprecated表記法とinterfaceメソッドを使用するが、それを実装するクラスでは使用しないことの利点は何ですか?

public interface Joe {

    @Deprecated
    public void doSomething();

    ...
}

public final class Joseph implements Joe {

    public void doSomething() {
       ...
    }

    ...
}
4

4 に答える 4

11

@Deprecated はドキュメントです。人々がインターフェイスにコーディングする場合、そのインターフェイスの特定の側面を非推奨としてマークできます。そうすれば、人々はそれを使用しないことを知っています。

インターフェイスの実装クラスは詳細です。そのクラスのメソッドはたまたまインターフェースを満たしていますが、それ自体では非推奨になることはありません。そのメソッドを非推奨にすることは、適切な場合とそうでない場合があります。

インターフェイスを実装する新しいクラスを作成するということは、非推奨のメソッドを実装する必要があることを意味します。クラスのクライアントが非推奨のメソッドを使用していないことがわかっていない限り、それらはおそらく機能するはずです。たとえば、HTTP サーブレット コンテナーを作成している場合は、HttpServletResponse.encodeUrl()メソッドを実装する必要がありencodeURL()ます。これは、クラスのユーザーが非推奨のメソッドを呼び出す可能性があるためです。

于 2009-08-12T19:04:53.203 に答える
9

Java言語自体の欠点であり、インターフェースのメソッドをアノテーションを介して非推奨として指定し、実装クラスでメソッドを非推奨と見なさないことはナンセンスだと思います。

メソッドの @deprecated 性が継承された方がよいでしょう。残念ながら、Java はこれをサポートしていないようです。

IDE などのツールがこの状況をどのように処理するかを検討してください。変数の型がインターフェイスであると宣言されている場合、@deprecated メソッドは取り消し線付きでレンダリングできます。ただし、変数の型が実装クラスとして宣言されていて、クラス シグネチャに @deprecated が含まれていない場合、メソッドは取り消し線なしでレンダリングされます。

根本的な問題は次のとおりです。あるメソッドがインターフェイスで非推奨になり、実装クラス (または拡張インターフェイス) では非推奨になるとはどういう意味ですか? 唯一の合理的な意図は、クラス階層内のインターフェースより下のすべてのメソッドを非推奨にすることです。しかし、言語はその動作をサポートしていません。

于 2009-08-12T22:25:23.767 に答える
6

私の意見では、それは物議を醸しています:非推奨のメソッドインターフェースは、その実装に関係なく使用すべきではありません(そうでない場合は反例を提供してください)

于 2009-08-12T18:25:15.187 に答える
0

インターフェイスと実装で不適切なメソッドを使用して既存のコードをリファクタリングする場合は、@Deprecatedいくつかのリリースで一時的にクリーンな新しいメソッドを優先してインターフェイス メソッドで使用できます。コードの下位互換性を維持するためだけに、それを利用することができます。これにより、IDE および SONAR レポートに、非推奨のメソッドであり、クライアントに新しいメソッドの使用を強制することが示されます。

于 2015-11-12T10:24:50.723 に答える