ラムダ式、ラムダ式、ラムダ式。Java 8の話題になるとそればかり耳にしますが、これは新機能の1つに過ぎず、他にもたくさんあります。強力な新しいクラスや新しい使い方、もっと前にJavaに追加されていたはずの機能もあります。
ここでは、個人的に知っておいて損はないと思う新機能を10個取り上げます。必ず当てはまるものがあるので、ぜひチェックしてみてください。
- default
これはJava言語の新しい機能で、インターフェース・クラスにメソッド本体を含めることができるようになりました。これらのメソッドは、このインターフェイスを実装するすべてのサブクラスに暗黙的に追加されます。
- プロセスの終了
いったん外部プロセスを開始すると、そのプロセスがクラッシュしたり、ハングアップしたり、CPUが100%になったりしたときに、戻ってきてお尻を拭かなければなりません。
ひとつは isAlive() メソッドで、プロセスが生きているかどうかを判定します。これは destroyForcibly() というメソッドで、タイムアウトしたり不要になったりしたプロセスを強制終了させるために使用します。
- StampedLock
この話を聞くと、ちょっと興奮せずにはいられません。コードに同期を使いたがる人はいません。同期を使うと、アプリケーションのスループットは間違いなく低下します。にもかかわらず、どうしても必要な場合もあります。
複数のプロセスがリソースにアクセスする際に同期を取る方法はいくつかあります。最もよく使われるもののひとつが ReadWriteLock で、これをベースにした実装がいくつかあります。これは、書き込みスレッドをブロックすることで、複数のスレッドが同時に読み込むことを可能にします。聞こえはいいですが、実際にはこのロックは遅すぎます。
Java 8では、StampedLockと呼ばれる新しい読み取り/書き込みロックが導入され、高速化されただけでなく、楽観的ロックのための強力なAPIセットも提供されています。アクセス終了時にロックを照会して、その間に書き込み操作があったかどうかを判断し、あった場合は再試行するか、ロックをアップグレードするか、操作を中止するかを選択できます。
これは実に強力なツールで、専用の記事を書く価値があります。私はこの新しいガジェットにとても興奮し、感激しています。
詳しくはこちらクリックしてください。
- コンカレント・カウンター
これもマルチスレッドプログラムで使用されるウィジェットです。マルチスレッド用の同時読み書きカウンタのためのシンプルで効率的な新しいインタフェースを提供し、AtomicIntegerと比べて少し高速です。かなり素晴らしいツールです。
- Optional
またヌル・ポインタが発生しました。おそらく、少なくとも1965以来、最も一般的な例外です。
Java 8はScalaとHaskellを参考にし、NULLかもしれない参照をカプセル化するために使用できる新しいOptionalテンプレートを提供します。これは決してNULLポインターをなくす特効薬ではなく、APIの設計者がコード・レベルでメソッドがNULLを返す可能性があり、呼び出し元がこの状況を認識する必要があることを宣言できるようにする方法です。このため、これは新しいAPIにのみ有効で、呼び出し元が参照をラッパークラスから逃がさないことを条件とします。
この新機能は本当に好きでもあり嫌いでもあります。一方では、ヌル・ポインターは大きな問題であり、その問題を解決してくれるなら何でも歓迎です。しかし、その一方で、この新機能がその任務を果たせるかどうかについては懐疑的です。というのも、これを使うには全社的な取り組みが必要であり、短期的に結果を出すのは難しいからです。強力に推進しない限り、迷走する可能性が高いでしょう。
- すべてコメント可能です
もう1つの小さな改良点は、Javaアノテーションが任意の型をサポートできるようになったことです。アノテーションを使用できるのは、クラス宣言やメソッド宣言のようなものだけでした。Java 8では、変数やパラメーターを宣言するとき、型を変換するとき、あるいは新しいオブジェクトを割り当てるときにもアノテーションを使用できます。これは、JavaがFireBugのような静的解析ツールや検出ツールをよりよくサポートするために行っている作業の一部です。これは素晴らしい機能ですが、Java 7のinvokeDynamicのように、その真価はコミュニティが将来これをどのように使うかにかかっています。
- 数値のオーバーフロー
これらのメソッド、Javaのコア・クラス・ライブラリで長い間待たされていたものです。私は2^32を超える整数のオーバーフローをテストするのが好きで、厄介なランダム・バグが発生します。
繰り返しますが、これは特効薬ではありません。単に、数値演算に+/*演算子を使用した場合にオーバーフローが発生すると例外がスローされるように、一連の関数を提供しているだけです。もし私次第なら、JVMのデフォルト・モードとして、数値演算のオーバーフローに対して明示的に関数をマークするようにします。
- ディレクトリトラバーサル
ディレクトリ・ツリーをトラバースする方法は、通常ググって調べなければならないものですが、Java 8ではFilesクラスを一新し、新しいメソッドを10個追加しました。私のお気に入りはwalk()メソッドで、ディレクトリをトラバースした後に不活性ストリームを作成します。
- 強化された乱数生成
パスワードやキーの攻撃に対する脆弱性について、多くの話題があります。セキュリティのプログラミングは複雑なプロジェクトであり、間違えるのは簡単です。そのため、新しいSecureRandom.getinstanceStrong()メソッドが気に入っています。このメソッドは、JVMで現在利用可能な最良の乱数生成器を自動的に選択します。これにより、フェッチに失敗する可能性が低くなります。また、デフォルトの弱い乱数生成器では、キーや暗号化された値が簡単にハッキングされてしまうという問題も回避できます。
- Date.toInstant()
Java 8では新しい日付APIが導入されました。既存のAPIが使いにくかっただけで、理解するのは難しくありません。実際、Jodaは長い間Javaの日付APIとして選ばれてきました。しかし、新しいAPIにもかかわらず、まだ深刻な問題があります-大量の古いコードとライブラリがまだ古いAPIを使っているのです。
そして、この現状が続くこともわかっています。具体的にどうすればいいのでしょうか?
Java 8では、Dateクラスに新しいメソッドtoInstant()を追加し、Dateを新しい実装に変換することで、この問題をエレガントに解決しています。これにより、既存のコードが古いDate APIを使用したままでも、すぐに新しいAPIに切り替えることができます。