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


153

私はEclipseを使用してWebアプリケーションを開発しています。ちょうど今日、JARファイルを変更してstrutsのバージョンを更新しました。メソッドが廃止予定であるという警告がいくつかの場所で表示されますが、コードは正常に機能しています。

何か知りたい

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

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


7
無料で1955 Volkswagen Beetle提供されても、運転を続けますCorvette Stingrayか?(0:
KMån

75
@KManあなたはヨーロッパの車をアメリカの車と比較していますか?;)
ponzao

2
@Ponzaoと4他:Gotcha!(0;
KMån

2
違う?ここで私たちは死すべき話をしているのでしょうか、それともただ静脈を奪っているのでしょうか。
FastAl、

5
@アレクサンダーはあなたのコメントに投票しないので、あなたのコメントにも+1してください;)いずれにせよ、新しいコードが古いコードよりも1000倍優れていることは確かです。いつ壊れるかわからない新しいタイヤ1955 Volkswagen Beetleとの比較が良いでしょう1956 Volkswagen Beetle
Aleks、2014

回答:


265

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

非推奨の定義から:

@Deprecatedと注釈が付けられたプログラム要素は、通常は危険であるため、またはより良い代替手段が存在するために、プログラマが使用を控える要素です。

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

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

おそらくありません。サポート終了前と同様に機能します。APIメソッドの規約は変更されません。新しいより良い方法を優先して一部の内部データ構造を変更すると、パフォーマンスに影響が出る可能性がありますが、それはほとんどありません。


おかしな非推奨のJava APIでは、芋ですFontMetrics.getMaxDecent。廃止の理由:スペルミス。

非推奨。JDKバージョン1.1.1以降、getMaxDescent()に置き換えられました。


5
Java APIで次におかしな非推奨となるのは、AbstractButton(Swing)のsetMultiClickThreshhold(int threshhold)とgetMultiClickTreshhold()です。この2つに備えましょう。;)
JavaTechnical 2013

3
これをHTTP REFERERで行う必要があります。
厄介

1
@DaveMcClelland、69から70に変更:D;)
VdeX 2017

28

パフォーマンスを変更せずに非推奨のコードを使用することもできますが、メソッド/クラスを非推奨にする目的は、より良い方法があることをユーザーに通知することであり、将来のリリースでは非推奨のコードは削除される可能性があります。


1
パフォーマンスに変化がないことをどのように確認できますか?たとえば、内部データ構造の変更、たとえばHashSetからTreeSetへの変更が原因で剥奪発生する可能性があります。
aioobe 2010

@aioobe-私の理解では、OPは非推奨のコードの呼び出しにパフォーマンスの問題があるかどうかを尋ねましたが、生成されたバイトコードが変更されないことはありません(1.5より前はjavadocでしたが、現在は注釈が使用されていますが、それでもパフォーマンスに変化はありません)
abyx 2010

ライブラリのあるバージョンから別のバージョンに移行する場合、新しいバージョンのメソッドのバイトコードが前のバージョンの同じメソッドのバイトコードと同じである保証はありません。
aioobe 2010

@aioobe-単に非推奨にしてもバイトコードが変更されないという保証があります。これがOPの意味するところです。もちろん、コード自体が変更されるため、コードを非推奨にしています。
abyx 2010

以前と同じバージョンを使用し続けても、変更はありません。ただし、新しいバージョンのライブラリを使用していて、APIが廃止されていない場合、基礎となる実装が大幅に変更され、新しいAPIがそれを利用する場合、パフォーマンスは変更される可能性があります。この新しい構造に対して、以前ほど効率的です。
gregturn 2017年

21

用語

公式のSun用語集から:

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

ガイドを非推奨にする方法と時期から:

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

@Deprecated注釈は、さらなるステップを行って、危険を警告します:

注釈@Deprecatedが付けられたプログラム要素は、通常は危険であるため、またはより良い代替策が存在するために、プログラマーが使用を控える要素です。

参考文献


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

非推奨のメソッドを使用することが正しいか間違っているかという問題は、個別に検討する必要があります。ここにあるすべての単語を引用符「非推奨」に表示され効果的なJavaの第2版は

項目7:ファイナライザを回避するファイナライゼーションを保証すると主張する唯一の方法はSystem.runFinalizersOnExit、その邪悪な双子Runtime.runFinalizersOnExitです。これらのメソッドには致命的な欠陥があり、非推奨になっています。

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

項目70:スレッドの安全性の文書化System.runFinalizersOnExitメソッドはスレッドに敵対的であり、推奨されていません。

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

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

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

関連する質問


3
「非推奨」はラテン語の「de」+「precare」に由来し、「反対すること」を意味します。何かが非推奨であると説明されている場合、標準は祈る-懇願する-それを使用しないように。これは、その標準の将来のバージョンで削除される可能性があるという警告です。廃止予定の機能は、その標準の現在のバージョンの実装で完全に実装する必要があることに注意してください。けれども、自己批判的なユーモアについてのあなたの言及は、やや外れています。その意味での「自己非難」は、派生と意味が異なる「自己評価」の腐敗です。
dajames 2017

17

上記の優れた応答のほかに、廃止されたAPI呼び出しを削除する別の理由があることがわかりました。

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

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


11

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


1
経験から判断すると、「非推奨」とは実際には「これをもう使うべきではありませんが、いつでも利用できるようになる」という意味です。少なくともJava標準APIについては、廃止された後に実際に削除されるメソッドやクラスについては知りません。
マイケルボルグワート

1
@Michaelまあ、実際にはAPIが廃止予定の関数を削除することはめったにありません。コンパイラが「警告:STOP USING THIS YOU FOOL」を出力して10年間廃止される可能性があるためです。非推奨が実際にはめったに実際に起こった場合でも、「それを使用して、我々は、このアウトをしたいいつか、そうしてください停止」を意味することになっている私だと思う
マイケルMrozek

@Michael Mrozek:声明に同意しないIt certainly doesn't create a performance issue。それを述べるには主観的すぎる。
KMån

1
@KMan非推奨としてマークされた関数は、マークされる前よりも何らかの方法で効率が低下しません-以前とまったく同じように実行されます
Michael Mrozek

@Michael Borgwardt:ほとんどの標準化された言語でこのように機能します。そしてもちろん、廃止されたものが標準から削除された場合、一般的な実装ではそれを拡張として保持します。
David Thornley、2010

8

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


8

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

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


4
  1. 一般的にいいえ、deprecatedメソッドを使用しているライブラリから消えた場合や問題が発生した場合に問題を回避するための適切な緊急時対応策がある限り、メソッドを使用することは絶対に間違いではありません。Java API自体ではこれは発生しませんが、他のほとんどの場合は削除されます。ソフトウェアをサポートするライブラリをアップグレードしないことを特に計画している場合(長期的にはそうする必要があります)、deprecatedメソッドの使用に問題はありません。
  2. 番号。

3

はい、それは間違っています。

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

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

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

非推奨プロセスは、作成者がコードを古いAPIから新しいAPIに変更するのに十分な時間があることを確認するためにあります。この時間を活用してください。できるだけ早くコードを変更してください。


2

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


Removed?定義を参照してくださいstackoverflow.com/questions/2941900/...
KMån

1
@KMan-あなたが投稿したリンクには次のように書かれています-「このメソッドは、特定の期間、下位互換性のためにAPIに保持され、将来のリリースでは削除される可能性があります。」私は同じことを書きました-非推奨のメソッドのいくつかは近い将来または遠くに削除される可能性があります。
Petar Minchev 2010年

2

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

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

http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

Thread.stopが廃止されたのはなぜですか?

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


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

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


2

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

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

したがって、古い方法をまだ使用している場合、脅威があります。そのため、廃止の理由に注意し、それがあなたにどのように影響するかを確認してください。

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

非推奨の原因がパフォーマンスの問題である場合は、パフォーマンスの問題が発生します。それ以外の場合は、そのような問題が発生する理由はありません。再度指摘したいのですが、廃止予定の理由に注意してください。


2

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

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

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

Javaの@Deprecatedについても同じです。メソッドを使用することはできますが、自己責任で行ってください。将来的には、より優れた代替手段があり、サポートされなくなる可能性もあります。

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

編集:そして、マイケルが指摘したように、非推奨の理由が機能の欠陥に起因する場合(または機能が存在しないはずの場合)、明らかに非推奨のコードを使用しないでください。


1
「廃止されたコードを使用している場合は、新しいAPIにアップグレードする必要がない限り問題ありません」-完全ではありません。Thread.stop()が非推奨になっている理由を確認してください。JREのどのバージョンでも、それが問題であることがわかります。
マイケル

OK、私はむしろ「通常」うまく言うべきです(そのビットを更新します):)したがって、自己責任で使用してください。明らかに、それを非推奨にする理由がその機能の欠陥を停止するためである場合、それを使用しないことは理にかなっています。ただし、一般的には、非推奨のメソッドを使用するのが適切です。じゃあ、それはすべて廃止の理由に依存します。そうだね。
jamiebarrow 2010

1

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

ただし、.Netでは、[廃止]と宣言されている場合は、以前に使用したことがなくてもすぐに読んでください。約50%の確率で、交換よりも効率的または簡単に使用できます:-))

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


1

非推奨の方法とは、既存の方法よりもすべての面で優れている代替=代替方法があります。既存の古い方法よりも良い方法を使用する方が良い。下位互換性のために、古いメソッドは廃止されたままになっています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.