こんばんは。kimukimuです。
ついに昨日7/28、JDK7がリリースされましたね!
ホントは2年前にリリースする予定だった気がしますが、気にしない方向で!
とまぁ、遅れた云々はおいておくとして、JDK7で気になる機能についてコメントしてみます!
1.NIO2
まずは個人的にJDK7で一番の目玉だと思っているNIO2です。
単なるNIOではネットワークに対してしかできなかった
非同期I/O処理が今度はファイルに対して出来るようになります!
例えば、これまではJavaで
『特定のファイルが更新されたら検知する』を実現しようと思えば、
『一定時間ごとにファイルを確認する』という処理を自前で作る必要がありました。
ですが、NIO2であれば、WatchServiceに確認するファイルを登録しておくだけで、
変更があったら検知することが出来ます。
他にもファイルの属性(最終更新時刻とか)を簡単に取得できるようになっていたり、
ディレクトリ配下のファイルを1つ1つ処理することがFileVisitorで簡単に出来たりと、
これまで自分でがりがり書くしかなかった部分を簡単に実現してくれます!
2.Try-catch節でのリソース自動解放
次はProject Coinのうちの1つ、Try-catch節でのリソース自動解放です。
何かというと、Try-Catch節の中で開いたリソースをTry-Catch節から出る際に
自動的に解放してくれるというものです。
例えば、データベースアクセス処理において、
これまではTry-Catch節を出た際にコネクションのクローズを忘れていると、
何度か接続しているうちにコネクション数がデータベースの許容数をオーバーして
突然接続できなくなるということがよく(?)ありました。
#いえ、別に私がやらかしたわけじゃないんですよ。きっと。
そのリソースの開放をJVM側で自動的にやってくれるようになります。
特に、『クローズに失敗したときの処理』を書かなくて済むようになるのが大きいですね。
コードが相当量削減されます。
3.例外のマルチキャッチ
3つ目はProject Coinのうちの1つ、例外のマルチキャッチです。
皆さんはプログラミングをしている時、
『違う例外に対して同じ例外処理を何度も書く』という経験がありませんか?
あれはストレスがたまりますよね。
丁寧に書けばコピペになっちゃいますし、
かといってまとめてExceptionでキャッチ!とかやると怒られますし。やるのも微妙ですし。
JDK7では下記のように、複数の例外のキャッチを1つの節で記述することができます。
- JDK6
try { //メイン処理 } catch (AException aex) { //例外処理 } catch (BException bex) { //例外処理 } catch (CException cex) { //例外処理 }
- JDK7
try { //メイン処理 } catch (AException | BException | CException abcex) { //例外処理 }
コードを書く量が格段に減りますよね!うれしい限りです。
4.diamond operator(Genericsインスタンス生成の際の型推論)
その1のラスト、4個目はProject Coinの
diamond operator(Genericsインスタンス生成の際の型推論)、です。
・・・といっても、これだけだと何かわかりませんよね。
何かというと、Genericsを用いたインスタンスを生成する際、
コンストラクタからクラス名を省略できるようになります。下のように。
- JDK6
List<String> list = new ArrayList<String>();
- JDK7
List<String> list = new ArrayList<>();
これだけだとあまりありがたみを感じないかもしれませんが、これだとどうでしょう。
- JDK6
Map<String, Map<String, MyEntity>> entityMap = new HashMap<String, Map<String, MyEntity>>();
- JDK7
Map<String, Map<String, MyEntity>> entityMap = new HashMap<>();
差は大きいですよね。
上記の4つのような感じで、新機能とコーディングを楽にする機能両方がJDK6に比べて充実しています。
出たばかりでは仕事で扱う機会というのはあまりないかもしれませんが、
こういう新しい、かつ効率的な仕組みには心躍りますよね!
皆さんもぜひお試しあれ。