2009-08-12 21 views
9

Javaプログラミングでは、@Deprecated表記法とインターフェイスメソッドを使用する利点がありますが、それを実装するクラスではありません。@Deprecated表記をインターフェイスでのみ使用する利点は何ですか?

+0

とにかくインターフェイスで-only-メソッドを償却するのはなぜですか?あなたのリリースのドキュメントに "Interface 'Joe'を使用することはお勧めしません。か何か。 – Zack

+0

インターフェイスとクラスには他の方法があります。混乱のために申し訳ありませんザック。 –

答えて

8

私はそれがJava言語そのものの欠点だと思っています。インタフェース内のメソッドをアノテーションで廃止し、メソッドを実装クラスで廃止予定とみなさないように指定するのはナシです。

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

IDEのようなツーリングがこのような状況をどのように処理するかを考えてみましょう。変数の型がインターフェイスであると宣言されている場合、@deprecatedメソッドはストライクスルーでレンダリングできます。しかし、変数の型が実装クラスであると宣言され、クラス署名に@deprecatedが含まれていない場合、メソッドはストライクスルーなしでレンダリングされます。

基本的な質問は、インターフェイスではなく、実装クラス(または拡張インターフェイス)で非推奨にする方法はどういう意味ですか?唯一の妥当な意図は、クラス階層内のインターフェースの下のすべてのものについてメソッドを非推奨にすることです。しかし、その言語はその行動をサポートしていません。

6

はそれが物議です。人がインタフェースにコード化した場合、そのインタフェースの特定の側面を廃止予定とすることができます。そのように人々はそれを使用しないことを知っている。

インターフェイスの実装クラスは詳細です。そのクラスのメソッドは、インタフェースを満足していますが、単独では非推奨にすることはできません。そのメソッドを非推奨にするかどうかは適切かもしれません。

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

+0

私は議論の余地がある以上に進んでいます。疑問だと思います。私は確かにそれがコードレビューで正当化されることを求めるでしょう。 – CPerkins

+1

どうしてですか?つまり、マルチメソッドインタフェースの1つのメソッドは、将来のリリースで削除される予定です。 –

+0

@Eugene:そうかもしれませんが、この例では1つの方法しか示していません。それで、なぜ1つの方法しかないのであれば、そのインターフェースを持っているのですか?:/ lol – Zack

11

@Deprecatedは文書である(ない場合は反例を提供してください)非推奨のメソッドインタフェースは、それが実装だかかわらず、使用できないべきではありません:私の意見では

public interface Joe { 

    @Deprecated 
    public void doSomething(); 

    ... 
} 

public final class Joseph implements Joe { 

    public void doSomething() { 
     ... 
    } 

    ... 
} 
+0

「[実装]メソッドを非推奨にすることは、適切でないかもしれません。具体的には、インタフェースメソッドdoSomethingはJoeのすべての実装には適していませんが、この特定の実装Josephには適している可能性があります。したがって、この特定の実装ではなくインタフェースでの非推奨です。 – drew

0

インタフェースと実装で不適切なメソッドで既存のコードをリファクタリングする場合は、インターフェイスメソッドで@Deprecatedを使用して、いくつかのリリースで新しいメソッドをクリーンにすることができます。私たちがそれを利用できるようにコードを下位互換性を保つためには、醜いかもしれません。これにより、IDEおよびSONARレポートで廃止予定のメソッドが表示され、クライアントに新しいメソッドを使用させることが示されます。

関連する問題