Oracle OpenWorld 2010現地レポート ~JavaOneの新たなステージ

Java SEの新技術とJavaFX最新動向―JavaOne 2010レポート(その2)

この記事を読むのに必要な時間:およそ 3.5 分

前回レポートしたようにJava SEは,もともとJava SE 7に含まれるとしていた機能をJava SE 7とJava SE 8に分割するということになりました。ここでは,次に示すJava SE 7の代表的な機能を紹介します。

  • Project Coin
  • JSR 292 InvokeDynamic

そして,Java SE 8に含まれる次の2つの機能も紹介します。

  • Project Jigsaw
  • Project Lambda

JavaOne初日(9月20日)Thomas Kuris氏のキーノートにおいて,JavaFXはクライアント技術の中核として注力することが発表されました。

これをうけて,次バージョンのJavaFX 2.0では大幅な変更が発表されました。そこで,本レポートではJavaFX 2.0についても紹介することにします。

Java SE 7の新機能

Project Coin: Small Language Changes for the JDK

Project Coinは今まで使い勝手の悪かった文法を使いやすくすることを目標にしたプロジェクトです。

プロジェクト名のコインは小銭ですね。英語では小銭のことをSmall Changeといいます。つまり,文法の小さな変更(Small Change)を行うプロジェクトなのでCoinという名前が付けられたわけです。

ちなみに,動詞のCoinは「新しい言語(言葉)を作る」という意味です。ちょっと意味深ですね。

講演者はProject CoinのリーダーであるJoseph Dercyと,Maurizio Cimadamoreです。

Project Coinで扱うJava言語の変更は一般から公募され,70以上の提案がありました。その中から8提案が採用されています。また,Java SE 7だけでなくJava SE 8もターゲットに加わったことから提案が追加されています。

現在,すでにOpenJDKで実装されている項目は次の通りです。

  • 2進数のリテラル
  • 数値リテラルに対するアンダースコアを使った区切り
  • 文字列をswitch文に使用する
  • 可変引数に対する警告の変更
  • ジェネリクス定義の簡略化
  • 複数例外のキャッチと再スロー
  • ストリームなどのクローズ処理の自動化

この中のいくつかを簡単に説明しましょう。

Java言語では16進数を数値の前に0xを付加することで表せます。同じように0bを付加することで2進数を表すことができるようになります。また,1_234_567_890のようにアンダースコアを使うことで可読性を高められるようになります。

ジェネリクスを使ったオブジェクトの生成では,ジェネリクスのパラメータが複雑な場合記述するのが大変です。そこで,次のように記述できるようになりました。

List<String> messages = new ArrayList<>();

このように,newを使用したオブジェクト生成の部分はジェネリクスであることを明記すればいいだけになっています。この<>という書き方は,その形状からダイアモンドオペレータという呼び方をします。

最後のクローズ処理の自動化を使用すると,ストリームのクローズ処理を記述しなくてもよくなります。

try(InputStream in = new FileInputStream(src);
    OutputStream out = new FileOutputStream(dest)) {

    byte[] buf = new byte[8192];
    int n;
    while ((n = in.read(buf)) >= 0) {
        out.write(buf, 0, n);
    }
}

tryの後のカッコの中にストリームの生成処理を記述しておくことで,try節を抜ける時にクローズ処理を行なうようになります。

現時点で実装されていない項目を以下に示します。

  • コレクションのリテラル
  • コレクションの要素に対する[ ]を使用したアクセス
  • 巨大な配列
  • 複数行からなる文字列

Project Coinでは,あくまでも文法の小さい変更だけにとどまっています。したがって,Java SE 8で採用が考えられているバリュークラスなどは変更が大きいため,Porject Coinでは扱わないようです。

Multiple Language, One Virtual Machine

このセッションは,Java VMで動的型付け言語をサポートするためのJSR 292 Supporting Dynamically Typed Languages on the Java Platformに関するセッションです。

講演者はBrian Goetz氏とJohn Rose氏。講演者の2人はJava VMのスペシャリスト。特にBrian Goetz氏は言語仕様の変更に関するセッションには引っ張りだこです。本レポートでもProject Lambdaに登場しています。

図1 Brian Goetz氏

図1 Brian Goetz氏

図2 John Rose氏

図2 John Rose氏

John RoseはJSR 292のスペックリードであり,JSR 292の参照実装を行うDa Vinci Machine Projectも率いています。

Javaはよく知られているように静的型付けの言語です。コンパイル時には変数の型,メソッドの引数や戻り値の型などは明確に定義しておかなければなりません。それに対して,JavaScriptやRubyのような動的型付けの言語もあります。動的型付けの言語では,型は実行時まで決まりません。

しかし,Rhino(JavaScript)やJRubyなどJava VMの上で動作させるスクリプト言語も増えてきました。

そこで,動的型付けの言語を容易にサポートしやすいように,新しくinvokeDynamicバイトコードが導入されることになりました。

invokeDynamicは,引数の型と戻り値の型を実行時に決めるメソッドコールに対して使用されます。実行時にはメソッドに対する参照を表すMethodHandleクラスを使用して,実行するメソッドを決定します。

後述するProject Lambdaのラムダ式も,このMethodHandleクラスを利用して実現されています。

著者プロフィール

櫻庭祐一(さくらばゆういち)

横河電機に勤務するかたわらJava in the Boxにて新しい技術を追い続けています。JavaOneは今年で11年目。名実共にJavaOneフリークと化しています。

コメント

コメントの記入