web-dev-qa-db-ja.com

Javaで非推奨のメソッドまたはクラスを使用するのは間違っていますか?

Eclipseを使用してWebアプリケーションを開発しています。本日、JARファイルを変更してStrutsバージョンを更新しました。メソッドが非推奨であるという警告がいくつかの場所で出ていますが、コードは正常に機能しています。

何か知りたい

  1. Javaで非推奨のメソッドまたはクラスを使用するのは間違っていますか?

  2. メソッドを変更せず、警告を表示してアプリケーションを実行すると、パフォーマンスの問題が発生します。

149
Umesh Aawte

1。 Javaで非推奨のメソッドまたはクラスを使用するのは間違っていますか?

非推奨の定義 から:

@Deprecatedアノテーションが付けられたプログラム要素は、一般的に危険であるため、またはより良い代替手段が存在するために、プログラマが使用することを推奨しないものです。

このメソッドは、不特定の期間の後方互換性のためにAPIに保持され、将来のリリースでは削除される可能性があります。つまり、いいえ、それはwrongではありませんが、より良い方法があり、APIの変更に対してより堅牢です。

2。メソッドを変更せずに警告を表示してアプリケーションを実行すると、パフォーマンスの問題が発生します

ほとんどありません。廃止前と同様に機能し続けます。 APIメソッドのコントラクトは変更されません。内部データ構造の一部が変更され、新しいより良い方法が採用された場合、パフォーマンスに影響が出る可能性がありますが、それはほとんどありません。


Java AP​​Iの最もおかしい廃止はimo、 FontMetrics.getMaxDecent です。非推奨の理由:スペルミス。

廃止予定。 JDKバージョン1.1.1以降、getMaxDescent()に置き換えられました。

261
aioobe

パフォーマンスを変更せずに非推奨コードを引き続き使用できますが、メソッド/クラスを非推奨にすることの重要なポイントは、ユーザーにそれを使用するより良い方法があることを知らせることであり、将来のリリースでは非推奨コードが削除される可能性が高いことです。

28
abyx

用語

Sunの公式用語集から:

deprecation:推奨されなくなったクラス、インターフェース、コンストラクター、メソッド、またはフィールドを指し、将来のバージョンでは存在しなくなる可能性があります。

廃止の方法と時期からガイドから:

「自己非難するユーモア」という言葉、または話者の重要性を最小限に抑えるユーモアを聞いたことがあるかもしれません。非推奨のクラスまたはメソッドはそのようなものです。もはや重要ではありません。実際、これはあまり重要ではないので、もはや使用するべきではありません。なぜなら、それは置き換えられ、将来存在しなくなる可能性があるからです。

@Deprecatedアノテーションはさらに一歩進んで危険を警告します。

注釈付きのプログラム要素@Deprecatedは、通常はdangerousであるか、より優れた代替手段があるため、プログラマが使用することを推奨していません。

参照資料


正しいか間違っていますか?

非推奨のメソッドを使用することが正しいか間違っているかという問題は、個別に検討する必要があります。ここにALLがあります"deprecated"Effective Java第2版

項目7:ファイナライザーを使用しない:ファイナライズを保証すると主張する唯一の方法は、System.runFinalizersOnExitとその邪悪な双子Runtime.runFinalizersOnExitです。これらのメソッドには致命的な欠陥があり、推奨されていません。

項目66:共有可変データへのアクセスの同期:ライブラリはThread.stopメソッドを提供しますが、このメソッドは本質的に非推奨であるため- nsafe-使用するとデータが破損する可能性があります。

項目70:スレッドの安全性を文書化するSystem.runFinalizersOnExitメソッドはスレッドに敵対的であり、廃止されました。

項目73:スレッドグループの回避:特定のThreadプリミティブをスレッドの束に一度に適用できます。これらのプリミティブのいくつかは廃止され、残りはほとんど使用されません。 [...]スレッドグループは廃止されました。

したがって、少なくとも上記のすべての方法では、少なくともJosh Blochによると、それらを使用することは明らかに間違っています。

他の方法では、問題を個別に検討し、なぜが非推奨になったかを理解する必要がありますが、一般的に言えば、正当化され、それらを使用し続ける権利よりも間違った方向に傾く傾向があります。

関連する質問

21

上記のすべての優れた応答とは別に、非推奨のAPI呼び出しを削除する別の理由があることがわかりました。

呼び出しが非推奨になった理由を調査していると、Java/API /フレームワークについて興味深いことを学んでいることがよくあります。多くの場合、メソッドが非推奨になっている正当な理由があり、これらの理由を理解するとより深い洞察が得られます。

学習/成長の観点から、それはまた価値のある努力です

17
Peter Tillemans

確かにパフォーマンスの問題を引き起こすことはありません-非推奨は将来、関数がライブラリの一部ではなくなる可能性が高いことを意味するため、新しいコードでの使用を避け、古いコードを変更する必要があります使用を停止するためのコード。これにより、いつかストラットをアップグレードしても機能が存在しなくなったときに問題が発生することはありません。

11
Michael Mrozek

「自己非難するユーモア」という言葉を聞いたことがあるかもしれません。それはあなたの重要性を最小限に抑えるユーモアです。非推奨のクラスまたはメソッドはそのようなものです。もはや重要ではありません。実際にはあまり重要ではないので、今後は使用されなくなる可能性が高いため、まったく使用しないでください。

それを避けるようにしてください

8
Jigar Joshi

それは間違っていません、ただお勧めしません。一般的に、この時点で物事を行うためのより良い方法があり、新しい改善された方法を使用すると良いことをすることを意味します。いくつかの非推奨のものは本当に危険であり、完全に避けるべきです。新しい方法は、非推奨の方法よりもパフォーマンスが向上しますが、常にそうとは限りません。

7
Bozhidar Batsov
  1. 通常、使用しているライブラリからメソッドが消えた場合や問題が発生した場合に問題を回避するための優れた偶発的な計画がある限り、deprecatedメソッドを使用することは絶対に間違っていません。 Java AP​​I自体では、これは決して起こりませんが、他のほとんどの場合、それは削除されることを意味します。ソフトウェアをサポートするライブラリをアップグレードしないことを明確に計画している場合(おそらく長期的にはそうする必要があります)、deprecatedメソッドを使用しても問題はありません。
  2. 番号。
4
Esko

はい、間違っています。

非推奨のメソッドまたはクラスは、Javaの将来のバージョンで削除されるため、使用しないでください。いずれの場合も、利用可能な代替手段が必要です。それを使用します。

プロジェクトの目標を達成するために非推奨のクラスまたはメソッドを使用する必要がある場合がいくつかあります。この場合、実際に使用する以外に選択肢はありません。 Javaの将来のバージョンは、そのコードを破壊する可能性がありますが、それが要件である場合は、それと共に生きなければなりません。プロジェクト要件を満たすために何か間違ったことをしなければならなかったのは初めてではなく、おそらく最後ではありません。

Javaまたは他のライブラリの新しいバージョンにアップグレードすると、使用していたメソッドまたはクラスが非推奨になる場合があります。非推奨のメソッドはサポートされていませんが、予期しない結果が生じることはありません。ただし、そうではないというわけではないので、できるだけ早くコードを切り替えてください。

廃止プロセスは、作成者がコードを古いAPIから新しいAPIに変更するのに十分な時間を確保するためのものです。この時間を利用してください。コードをできるだけ早く変更します。

3
Erick Robertson

Javaで非推奨のメソッドまたはクラスを使用するのは間違っていますか?」

そのように間違っていませんが、それはあなたにいくつかのトラブルを救うことができます。非推奨のメソッドを使用しないことを強く推奨する例を次に示します。

http://Java.Sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

Thread.stopが非推奨になったのはなぜですか?

本質的に安全ではないからです。スレッドを停止すると、ロックされているすべてのモニターのロックが解除されます。 (ThreadDeath例外がスタックを伝播すると、モニターはロック解除されます。)これらのモニターによって以前に保護されたオブジェクトのいずれかが一貫性のない状態にあった場合、他のスレッドはこれらのオブジェクトを一貫性のない状態で表示する可能性があります。このようなオブジェクトは破損していると言われています。スレッドが破損したオブジェクトで動作すると、任意の動作が発生する可能性があります。この動作は微妙で検出が困難な場合もあれば、はっきりしている場合もあります。他のチェックされていない例外とは異なり、ThreadDeathはスレッドをサイレントに強制終了します。したがって、ユーザーには、プログラムが破損している可能性があるという警告はありません。破損は、実際の損傷が発生した後、数時間または数日後であっても、いつでも現れます。


メソッドを変更せず、警告を出してアプリケーションを実行すると、パフォーマンスの問題が発生します。

パフォーマンスの点で問題はないはずです。標準APIは、下位互換性を尊重するように設計されているため、アプリケーションをJavaの新しいバージョンに徐々に適合させることができます。

2
James P.

Javaで非推奨のメソッドまたはクラスを使用するのは間違っていますか?これは「間違った」ものではなく、まだ機能していますが、可能な限り避けてください。

メソッドにセキュリティ脆弱性があり、開発者がそれが設計上の欠陥であると判断したとします。そのため、彼らはメソッドを廃止し、新しい方法を導入することを決定するかもしれません。

したがって、まだ古い方法を使用していると、脅威が生じます。そのため、非推奨の理由に注意し、それがあなたにどのような影響を与えるかを確認してください。

メソッドを変更せず、警告を出してアプリケーションを実行すると、パフォーマンスの問題が発生します

非推奨がパフォーマンスの問題が原因である場合、パフォーマンスの問題に悩まされます。そうでない場合、そのような問題を抱える理由はありません。繰り返しますが、非推奨の理由に注意してください。

間違いではありませんが、非推奨のメソッドの一部は将来のバージョンのソフトウェアで削除されるため、コードが機能しなくなる可能性があります。

2
Petar Minchev

Javaでは@ Deprecated、C#では[Obsolete]です。

私はC#の用語を好むと思います。それは単に時代遅れだということです。必要に応じて引き続き使用できますが、おそらくより良い方法があります。

Windows 3.1が時代遅れだと思われる場合、Windows 7の代わりにWindows 3.1を使用するようなものです。引き続き使用できますが、将来のバージョンにはおそらくより優れた機能があり、将来のバージョンはおそらくサポートされます-廃止されたバージョンはサポートされません。

Javaの@Deprecatedについても同じです-メソッドを引き続き使用できますが、ご自身の責任で-将来的にはより良い代替手段があり、サポートされない可能性もあります。

廃止されたコードを使用している場合、新しいAPIにアップグレードする必要がない限り、通常は問題ありません。廃止されたコードは存在しない可能性があります。推奨されないコードを使用しているものが見られる場合、新しい代替を使用するように更新することをお勧めします(これは通常、注釈またはJavadocの推奨されないコメントで指摘されています)。

編集:Michaelが指摘したように、非推奨の理由が機能の欠陥に起因する場合(または機能が存在するべきではないため)、非推奨コードを使用すべきではないことは明らかです。

1
jamiebarrow

もちろんそうではありません-Java全体が@Deprecatedになっているので:-) Javaが続く限り自由に使用できます。いずれにせよ、それが本当に壊れていない限り、差分に気付かないでしょう。意味-それについて読んでから決定しなければなりません。

ただし、.Netでは、[廃止]が宣言された場合、以前に使用したことがない場合でもすぐに読み進めてください。交換よりも効率的および/または使いやすい可能性が約50%あります:-))

したがって、一般的に、最近はテクノ保守的であることが非常に有益ですが、最初に読書をする必要があります。

1
ZXX

非推奨のメソッドとは、既存の方法よりもすべての面で優れている、alternative = iveの方法が利用可能です。既存の古い方法よりも良い方法を使用する方が良い。後方互換性のために、古いメソッドは非推奨のままです。

1
DPM