66.nativeメソッドは気を付けて使うべし
native メソッド
Java Native Interface(JNI)を使って、CやC++で書かれたメソッドを呼べる。
歴史的に、nativeメソッドには3つの用途がある。
- windowsのレジストリなど、プラットフォーム特有の機能へアクセスするため
- レガシーなデータにアクセスするライブラリを含む、nativeコードのライブラリを使うため
- パフォーマンス向上のため
プラットフォーム特有の機能にアクセスするためにnativeメソッドを使うことは正当である。
とはいえ、Javaは成熟してきたので、だいたいの機能はある。例えば、Java9ではOSのプロセスにアクセスできたりする。
また、Javaにはないライブラリがnativeライブラリにある場合も、nativeメソッドを使ってよい。
性能のためにnativeメソッドを使うことはあまりない。
初期のJavaではそのようなことがあったらしいが、JVMの進化によりそんなに性能は変わらなくなっている。
nativeメソッドの欠点
nativeメソッドには大きな欠点がある。
- nativeメソッドはsafe(BOFとかが起きないという意味の、メモリ管理的な安全のことだと思う)でないので(Item50)、nativeメソッドを使っているアプリケーションは、Javaとは言え、メモリ破損のエラーに対して免疫があるとは言えなくなる。
- nativeメソッドはプラットフォームに大きく依存するので、移植性がなくなる。
- デバッグがむずい
- 下手すると性能劣化する。ガベージコレクターがうまく働かないことがあり得るし、nativeコードを行き来するコストがかさむためだ。
- 可読性が低く、冗長な記述が必要なグルーコードが必用。
つまり、よく考えてnativeメソッドを使えということ。