新規開発するコードでは、非推奨(deprecated)のフィールド、メソッド、クラスを使用してはならない。Java SE 6のドキュメントには非推奨APIの一覧が記載されている[API 2006]。特定のフィールドやメソッド、クラスが非推奨であることを表すためにJavaのアノテーション@deprecatedが用意されている。java.util.Dateのメソッドの多く、たとえばDate.getYear()は、非推奨であることが明示されている。「THI05-J. スレッドの強制終了にThread.stop()メソッドを使用しない」では非推奨メソッドであるThread.stop()を用いた場合に発生する問題について記述している。
また、廃止(obsolete)されたフィールドやメソッド、クラスも使用してはならない。廃止を示すためのアノテーションはJavaには存在しないが、いくつかのクラスやメソッドは廃止であることがドキュメントに記されている。たとえば、java.util.Dictionaryクラスは廃止されており、新規開発するコードでは代わりにjava.util.Map<K,V>を用いるべきである。
廃止されたメソッドとクラス
以下に挙げるメソッドやクラスを使用してはならない。
対象となるクラスやメソッド | 代替のクラスやメソッド | ルール |
---|---|---|
java.lang.Character.isJavaLetter() | java.lang.Character.isJavaIdentifierStart() | |
java.lang.Character.isJavaLetterOrDigit() | java.lang.Character.isJavaIdentifierPart() | |
java.lang.Character.isSpace() | java.lang.Character.isWhitespace() | |
java.lang.reflect.Class.newInstance() | java.lang.reflect.Constructor.newInstance() | ERR06-J. Do not let code throw undeclared checked exceptions |
java.util.Date (many methods) | java.util.Calendar | |
java.util.Dictionary | java.util.Map<K,V> | |
java.util.Properties.save() | java.util.Properties.store() | |
java.lang.Thread.run() | java.lang.Thread.start() | THI00-J. Do not invoke Thread.run() |
java.lang.Thread.stop() | java.lang.Thread.interrupt() | THI05-J. Do not use Thread.stop() to terminate threads |
java.lang.ThreadGroup (many methods) | java.util.concurrent.Executor | THI01-J. Do not invoke ThreadGroup methods |
JVM Profiler Interface(JVMPI)およびJVM Debug Interface(JVMDI)は非推奨であり、JVM Tool Interface(JVMTI)に代替されている。詳しくは「ENV05-J. 遠隔から監視できる状態のままアプリケーションを実運用しない」を参照。
リスク評価
非推奨あるいは廃止されたクラスやメソッドを使用すると、プログラムの誤動作につながる恐れがある。
ルール | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
---|---|---|---|---|---|
MET02-J | 高 | 高 | 中 | P18 | L1 |
自動検出
非推奨メソッドの使用を検知するのは容易である。廃止されたメソッドやスレッドセーフでないメソッドの使用を自動検出する方法は存在しない。
関連ガイドライン
ISO/IEC TR 24772:2010 | Deprecated language features [MEM] |
MITRE CWE | CWE-589. Call to non-ubiquitous API |
参考文献
[API 2006] | Deprecated API, Dictionary |
[SDN 2008] | Bug database, Bug ID 4264153 |
翻訳元
これは以下のページを翻訳したものです。
MET02-J. Do not use deprecated or obsolete classes or methods (revision 84)