JavaOne/Oracle OpenWorldレポート - Javaコア言語編 -
2010/9/19(日)から9/23(木)までJavaOne/Oracle OpenWorld2010に参加したレポートの続きです。繰り返しになりますが同じ但し書きを載せます。
客観的で公平な記事はプロのジャーナリストに任せて、このブログでは偏向した意見や個人的な感想を織り交ぜて書きます。なお、英語力と記憶力のため間違いがあるかもしれません。間違いを見つけたら指摘してください。
今日はJavaOneコア言語をレポートします。
主にMark Reinhold氏の講演とProject Coinのセッションが元ネタです。
最初にみんな気になるJava7の話です。Java7は来年(2011年の中期)リリースされるようです。今まで狼少年状態だったので懐疑的な見方もあるかもしれませんが、たぶん今回は出そうです。ソフトウェア開発に何があるかわからないので2011年末ぐらいまで延びる可能性はありますが流石にJava7が2012年まで延びることはないと思います。こう思える理由は、Java7は大きな言語仕様の変更をしないリリースにして、大きな言語機能の変更をJava8にまわすからです。Mark Reinhold氏の言葉を借りれば、過去のJavaのリリースは大きく変わったrevolutionと小さな変更のevolutionリリースがあり、Java7はevolutionリリース、Java8はrevolutionリリース、という位置づけです。この方針なので、Java7は難しい機能を先送りしてリリース時期を守る、というリリース管理ができます。一方、Java8は2012年末リリース予定とのことですが、こちらが守られる保証はありません。
Java8にまわされる大きな機能はProject LambdaとProject Jigsawです。Project LambdaはいわゆるJavaにクロージャ導入と散々言われてきたあれです。後者はパッケージより大きな単位のモジュールと呼ばれる機能のことです。
Project Lambdaの背景は、C#にdelegationがあるから、という日和った理由ではなく、マルチコア時代での並列処理を効率化するため、と説明していました。Java8では実際の構文が変わる可能性もあるので雰囲気だけ書きます。
students.filter(#{ s -> s.gradYear == 2010 }) .map(#{ s -> s.score }) .max();
匿名クラスのコード例からここまでコードが簡易になる流れをプレゼンで紹介していました。結局、これが最終形態なのか確信がないせいか、会場も大盛り上がり、という感じはありませんでした。
むしろProject Jigsawの方が盛り上がったぐらいです。classpath地獄になっている状況をモジュールで解決します。-classpathがスクリーンに表示され×印で-classpath否定の画面になると会場から拍手が起きました(火曜のMark Reinhold氏の講演)。
Project Jigsawは原則としてMavenがやっていることをコア言語に取り込むスタンスに見えます。実際、Mavenの.pomファイルからJigsawのモジュールに変換する方法も提供されるようです。Maven側の人から見てProject Jigsawがどういう存在なのかは不明です。自分たちの存在意義と対立する憎むべきものなのか、あるいは自分たちの正しさが認められた誇るべき成果なのか、あるいはJigsawはMavenのカバー範囲のほんの小さな一部分に過ぎず些細な存在かもしれません。知っている人がいたら教えてください。
月曜のMark Reinhold氏の講演ではプロパティ機能も紹介がありました。キーワードpropertyでgetter、setter地獄がなくなるくだりでも会場から拍手が起きました。この機能がJava7なのかJava8なのか聞き逃しました。たぶんJava8だと思います。
Mark Reinhold氏の講演では、JRockit(BEA由来のJVM)とHotSpot JVM(ご存知Sun由来のJVM)の統合の話もありました。微妙に言っていることがよくわからなかったので、後でオラクルのブースでJVM統合の件を聞いてみました。ブースに担当者がふたりいたのですが、ひとりは力強く統合すると言い切り、2年ぐらいかかるんじゃない、とのことでした。もうひとりは懐疑的な見方を示し、かつJRockitの一部機能は有償で提供するかも、と言っていました。異なるコードベースの統合が生易しいものでないことは現場に近ければ近いほど実感できるはずです。結局、ふたつのJVMの統合に関しては、公式見解は統合ですが、現場は困惑気味という辺りが実状な気がします。ふたつのJVMを統合して両者の良いところ取りをすれば最高のJVMができる、なんて神話を信じる人はいないですよね。
Java7の漸進的な進化はProject Coinと呼ばれる成果がベースです。以下のサイトがそうです。
Project Coinの紹介、つまりJava7に入りそうな機能の紹介をします。
Improved Type Inference for Generic Instance Creation
型推論でジェネリック型の型引数を省略できる機能です。具体例を見ると一目瞭然です。
Java6以前で
List<String> list = new ArrayList<String>();
と書いていたのが
List<String> list = new ArrayList<>();
と書けます。<>からdiamondと呼ばれています。
上の例だと少し嬉しい程度にしか見えませんが(Stringの記述をひとつ省略できるだけ)、次ぐらいになるとだいぶ嬉しい感じです。
Map<String, List<String>> map = new HashMap<String, List<String>>(); が Map<String, List<String>> map = new HashMap<>(); と書けます
型推論に関連してProject Coinの個別セッションで少し面白い話がありました。
Java6で次のように書けます。
List<? extends Number> list = new ArrayList<Integer>();
次のようにも書けます。
List<? extends Number> list = new ArrayList<Number>();
diamond表記にすると次になります。
List<? extends Number> list = new ArrayList<>();
この時、ArrayList<Number>とArrayList<Integer>のどっちに推論すべきか、という問いです。
代入式の左辺だけ見て判断するsimple推論と実引数も合わせて見るcomplex推論のふたつを挙げて、前者だとArrayList<Number>、後者だとArrayList<Integer>になる、と例を挙げていました。具体的にどんなスライドの内容だったか忘れました。スライド見ている時はなるほどと思う内容でしたが、思い出せません。
スライドと違っている可能性はありますが、強引に思いつけるコード例は以下のような感じです。simple推論で代入先の変数型だけ見るとNumber、コンストラクタの実引数も見るcomplex推論だとInteger、となります。
List<? extends Number> list = new ArrayList<>(Arrays.asList(1,2));
どちらの型推論が正解というわけでもなく、既存のコードで両方の戦略で型推論させてどちらが良いか比較したという話です。結局、どちらも90%ぐらいOKで甲乙つけがたいという感じでした。
ここから先が自分の英語力の無さが非常に情けないのですが、たぶん最終的にcomplex推論にした、と言ったと思うのですがいまいち聞き取りに自信がありません。
Automatic Resource Management
例外が発生した時に確実にリソース解放処理を走らせるため、finally節にリソース解放処理を書くイディオムがあります。Javaの中では悪くないイディオムだと思っていましたが、解放処理自体で発生する例外まで考えると、実は意外な落とし穴があります。
try-finallyの入れ子がどうなるかは次を見てください。
上記ページから引用ですが、Project Coinで(つまり問題なければJava7で)次のように書けるようになります。
try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest)) { 省略 }
try文を抜けるとInputStreamとOutputStreamのリソース解放処理(close処理)が走ります。
これがうまく働くにはストリームクラスがAutoClosableインターフェースを実装している必要があります。
素晴らしい、Java7で一番うれしい機能だと、と聞いていた時は興奮しました。
が、日本に戻って冷静になってみると、興奮するほど素晴らしいのか微妙になってきました。何が気になるかと言うと、過去の遺産を考えると、AutoClosableインターフェースを実装しているクラスばかりではない事実があるからです。そうすると、上記構文(なんと呼べばいいのかわからないのでAutoClosable構文と呼びます)と従来のfinallyイディオムを使いわける必要がでてきそうです。AutoClosableがあるかどうかで書き方を変えるのは、考えることが増える気がします。
こんなことを気にして書き方を変えるぐらいなら、一貫して書けるC++のRAIIイディオムの方がマシに見えてきます。
まだよくわかっていない部分もあるので何かを見逃している可能性もあります。
Strings in switch
switch-case文のcaseの定数式に文字列を書ける説明がありました。地味に嬉しいと言うか、できてみるとなぜ今までできなかったのかという気にすらなります。今まではCの呪縛でしょうか。
具体例は http://mail.openjdk.java.net/pipermail/coin-dev/2009-February/000001.html を見てください。
Improved Exception Handling for Java
try { 省略 } catch (FooException ex) { 省略 } catch (BarException ex) { 省略 }
を
try { 省略 } catch (FooException | BarException ex) { 省略 }
と書ける例外のmulti-catchの説明もありました。
more precise rethrowというお題目での説明もあったのですが、聞き取れず...
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/javaone2010-javacore/tbping