<< 2011/10/03 | Home | 2011/10/05 >>
PR: 転職    お墓    エコ    通販    結婚相談所    シルバー    質屋    葬式    漫画    エステサロン   

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 predicate)
  default Iterables.filter;

この場合Iterables.filterはstaticメソッドで、第一引数にthisが、第二引数にpredicateが渡される。これはC#のextension methodからインスパイアされたものかな。

Jigsawは依存関係の解決をするための仕様。昔はJAMファイルとか言ってなかったっけ。これによりJDKのライブラリも分割して、headlessだけ、とかdesktopだけという括りにして小さくできるのだそう。そういえばOSGiとの関係はどうなるんだろうか。いずれにせよMavenのXML嫌いなんで、こっちが主流になって欲しい。

Java9の予定

  1. Self tuning
  2. Improve native integration
  3. Big data
  4. Reification 型システムの改善(Primitiveの改善)
  5. Tail calls/continuation
  6. Meta-object protocolresource management
  7. 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の話があったらしいけど、時間切れなのと仕事でも趣味でもいじること無さそうなので退室。

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8