BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Java SE 7 リリース:2006 年12月以来のメジャーアップデート

Java SE 7 リリース:2006 年12月以来のメジャーアップデート

ブックマーク

原文(投稿日:2011/07/28)へのリンク

Java 7 が本日から正式リリースされた。これはOracleがSunを買収してから最初にリリースされたJavaプラットフォームである。このリリースは数々の小さいが有用な言語仕様の変更を含んでおり、新しいファイルAPIやFork/Joinフレームワークを取り込み、JVM上の動的言語のサポートも改善している。。

Java 7 の言語仕様の変更は、Project Coin(JSR 334)の一部として位置付けられる。Project CoinはJSR 201の後継であり、生産性を向上させる小さな変更を施し、Java 言語を強化するよう設計されている。 特にtry-with-resources 機能が注目に値する。これはC#のusing文に相当するものであるが、形式はJavaのtry文がベースになっている。 その結果、using文ではリソースをひとつだけしか扱えないのに対し、try-with-resources ではひとつのブロックの範囲内で同時に複数のリソースの処理をすることができる。

また、例外ハンドリングに関して2つ言語仕様の変更があった。ひとつは例外型の名前を列挙することによりひとつのcatchブロックに複数の型の例外を処理できるようになったことである。 try文のcatch節の文法が拡張され複数の型を例外のパラメータ宣言で指定きるようになった。 例外型は"OR" オペレーターシンボル "|"で区切って記述する。二つ目は、例外が修正されずにcatchブロック内で再スローされる場合、メソッドシグネチャのthrows にその例外を追記する必要がなくなった。

その他、以下のように言語仕様が変更された。

  1. swith文でStringが利用可能。
  2. バイナリリテラルとアンダースコア区切りの数値表現が利用可能。これにより、クレジットカードナンバのような長い数値を creditCardNumber = 1234_5678_9012_3456Lのように表現できるようになり、可読性が向上する
  3. 可変長引数メソッド呼び出しの単純化。 可変長引数でジェネリクスが使用されている場合に出るコンパイラの警告を変更している。 いままでメソッド呼び出し側で警告が出されていたが、Java 7ではメソッド宣言で警告が出される。
  4. ジェネリクスでのインスタンス生成時の型指定方法の改善(< > または ダイヤモンドオペレータ)。クラスのインスタンス生成時に型を指定する場合、文脈から類推できるにも関わらずパラメタ引数はコンストラクタで明示的に宣言する必要があったが、空の型パラメータで代替できるようになった。 よって、
    Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
    上の代わりに、以下のように書くことができるようになった。
    Map<String, List<String>> anagrams = new HashMap<>();

新しいAPIの中で主要なものが2つある。ひとつめはJSR 203であり、ファイルシステムへのアクセスやスケーラブルな非同期I/Oオペレーション、ソケット・チャネルバインディングとその設定、そしてマルチキャストデータグラムなどの機能を提供する新しいAPIが追加された。 エンタープライズの開発者にとっては、非同期IO APIが追加されたことが特に興味深いだろう。このような非同期処理は大量のコネクション下でも低いレーテンシーと高いスループットを要求するハイエンドのサーバアプリケーションでは重要だからである。また203で、ついにJava に、真のファイルシステムAPIが追加された。これにはOS特有の機能へのサポートも含まれる。例えば、OSがサポートしていれば、シンボリックリンクを作成することができるようになる。議論の余地はあるが、このように203 は厳密に "write-once-run-anywhere"の原則に沿っていない。もちろん、どのプラットフォームでも動く共通のAPIも多く含むものの、同じ程度にプラットフォーム固有の機能も含まれる。

2つ目の新しいAPIはFork/Join フレームワーク (JSR 166の一部)である。これはもともとJava 5で計画されていたものだ。この機能で、処理をタスクを分解し、任意の数のマルチコアプロセッサ上で並列に実行できるようになる。

他にも、新しいネットワークやセキュリティ機能への対応、 Unicode 6.0を含む国際化サポートの拡張なども盛り込まれている。

最後に、Java SE 7 では、Java創世以来初めて、InvokeDynamic という新しいバイトコード命令を追加した。InvokeDynamic では呼び出しモードを一つ、リンクモードをひとつ追加しており、 ユーザ定義仕様のプログラムが可能になる。特に、静的な型情報がない場合に効率的・柔軟にメソッドを呼び出すことができるように追加されたもので、これにより潜在的にJRubyやJythonなど、JVM上で動作するの動的言語のパフォーマンスを改善する。

新しい機能はもちろん喜ばしいが、いろいろな面でこのリリースで最もの重要なことは、やはりJava SE 7 が無事出荷されたということであろう。長期にわたりSunとApache Software Foundationが、Sun の吸収に伴うリーダーシップやリソースの問題で合意に至らなかったため、リリース間隔が非常に空いてしまった。Mark Reinhold氏は最近のインタビューでこのように答えた。

... ビジネス的、そして政治的な理由によりJava はしばらく冬眠モードに入っていました。けれども我々は戻ってきたし、7をこれから出荷します。これは革命リリースではなく, 進化リリースですが、ほんとうによい改良がいくつも含まれています。

Java SE 7 リリースを使ってみたい、興味のある開発者は、NetBeans IDE 7.0またはIntelliJ IDEA 10.5を利用すれば、Java SE 7 プラットフォームの新機能のサポートが得られる。Eclipse IndigoベータレベルではあるがJava 7をサポートしている 。 Oracle JDeveloper のJDK 7 サポート予定は本年末のリリースに含まれる予定である。

この記事に星をつける

おすすめ度
スタイル

BT