JavaOne 1日目
キーノート。出席者は増えているそうでなりより。来年は東京でJavaOneがあるそうだ(Apr 4-6)。
最初のパートは、スポンサーIntel様の宣伝タイム。「この枠でこの内容ってことは、やはり一番お金を出してくれたんだろうな」などと邪推している横で、来場者は律儀に要所要所で拍手していて、みんなおとなだなぁと感心。なんかスループットの比較グラフで、1.7.0_01が、1.6.0_06の2倍以上の結果を叩き出しているんだけど、ハードウェアが違うんで、なんというか何を比較しているんだかって感じ。Oracle Fusionでは、同時に20000ユーザをさばけるのだそう。
NoSQLのパフォーマンス。96ノードまで良くスケールする。って製品名が出てこないんですけど、これってCoherenceの話ってわけじゃないんだろうか。
JavaSEの話は、いつも通りのProject Coin, InvokeDynamic, Fork/Joinの話。JigsawとLambdaはJava8に入る予定。型推論とかswitchでの文字列使用、マルチcatch、try-with-resource、16進数リテラルとかは、そろそろ食傷気味。で、知らなかった話題を2つ。1つ目はsafe rethrow
void m() throws X1, X2 {
try { /* X1, X2をスローする可能性のあるコード */ }
catch (Throwable e) {
throw e; // コンパイルエラー
}
}
この場合、try節内で発生するチェック例外がX1とX2だけであっても、Throwableでキャッチしてrethrowするから、throws節にThrowableが無いとコンパイルエラーになる。それを、
catch (final Throwable e) {
とすることで、rethrowできるようになるそうだ(さくらばさんからの指摘によると、finalは必須では無いらしい)。これは地味だけどJavaの例外の扱いでのストレスが減る良い改善だね(って書いていたら、どこかで見たような気もする)。もう1つが、safe varargs
public static <T> void print(T... a) {
for (T t : a) {
System.out.println(t);
}
}
public static void main(String[] args){
print(new Pair<Integer,String>(1,"One"), new Pair<Integer,String>(2,"Two"));
//WARNING: Type safety : A generic array of Pair<Integer,String>
//is created for a varargs parameter
}
この例は、ここから拝借したものだけど、可変引数は内部的には配列で実装されているんで、型パラメータを伴った型のオブジェクトを渡そうとすると警告が出る。で呼び出し側に、@SafeVarargsを付けてやると警告を抑制できるようになるそうだ。
@SafeVarargs
// WARNING SUPPRESSED: Type safety: Potential heap pollution via varargs parameter a
public static <T> void print(T... a) {
JRubyでの最適化が進んだそうだ。
def foo bar end def bar baz end def baz end
こんな例では、foo呼び出し => JRubyのコンテキスト => bar呼び出し => JRubyのコンテキスト => baz呼び出しとなって、思い切った最適化ができなかったのが、Java7でInvokeDynamicが入ったことで、foo -> bar -> bazとなってインライン化などの最適化が可能になったのだそう。これによりベンチマークで2-3倍の結果が出ていた。
Lambdaでは、卒業年が2011の生徒の成績の最大を求めるコードが以下のように書けますよという話。
double max = students.filter(s -> s.gradYear == 2011) .map(s-> s.core) .reduce(0.0, Math#max);
Math#maxという書き方は、staticメソッドをlambda式に変換するものらしい。まぁこのあたりはScalaとかではおなじみのやり方で、Javaでもようやくこういう書き方ができるようになるようだ。あと、
double max = students.parallel() .filter(s -> s.gradYear == 2011) .map(s-> s.core) .reduce(0.0, Math#max);
とすることで、並列実行もできるようになるそうだ。で、これらはIterableにfilterとか新たなメソッドを追加しなきゃいけないんだけど、そうすると既存のIterableを実装したコードがみんなコンパイルエラーになってしまう(そういえば、JDBCのConnectionとかバリバリメソッド追加されて、単体テストのモックがことごとくコンパイルエラーになって頭に来たよね)。で、インターフェースにdefault実装が追加できるようになるらしい。
interface Iterable{ Iterable filter(Predicate super T> predicate) default Iterables.filter;
この場合Iterables.filterはstaticメソッドで、第一引数にthisが、第二引数にpredicateが渡される。これはC#のextension methodからインスパイアされたものかな。
Jigsawは依存関係の解決をするための仕様。昔はJAMファイルとか言ってなかったっけ。これによりJDKのライブラリも分割して、headlessだけ、とかdesktopだけという括りにして小さくできるのだそう。そういえばOSGiとの関係はどうなるんだろうか。いずれにせよMavenのXML嫌いなんで、こっちが主流になって欲しい。
Java9の予定
- Self tuning
- Improve native integration
- Big data
- Reification 型システムの改善(Primitiveの改善)
- Tail calls/continuation
- Meta-object protocolresource management
- Heterogeneous compute modules
Self tuningって、HotSpotもself tuningじゃないのかな。あまり聞き取れなかったけど覚えている範囲で解説すると、Big dataは2GB以上のデータを扱えるようにする。Reificationは、intみたいな特別なprimitive型を無くす(多分Scalaみたいになる?)。という感じ。
JavaFXではCross platformを強調(多分Androidを意識していると思われる)。あとは2.0が出たよとか、デモとか。ただ正直ケータイの方はAndroidでキマりな感じだし、プロプライエタリなRIAは、flashもsilverlightも受け入れられない感じなわけで、そんな中でどういう戦略でJavaFXをはやらせようと考えているのか、そういう戦略的な話がキーノートでは聞きたかったところ(さくらばさんからの指摘によると、戦略的な話は昨年あったそうで、今後はデスクトップに注力するようです)。
JavaEE7の話。データソースをアノテーションで書けるようにするそうだ(nekopさんからの指摘によると、データソースの記載はJavaEE6からの機能だそうです)。
@DataSourceDefinition( name="java:app/jdbc/myDB", className="oracle.jdbc.pool.OracleDatasSource", isolationLevel=TRANSACTION_REPEATABLE_READ, initialPoolSize=5 )
みたいな。JMSとかJavaMailのセッションもアノテーションで書けるようにするらしい。Entity BeanのCMP/BMPと、JAX-RPC、Deplyment APIは消される(オプション実装になる)予定だそうだ。
このあとJavaMEの話があったらしいけど、時間切れなのと仕事でも趣味でもいじること無さそうなので退室。





