Upcoming Java Programming-Language Changes

Javaの言語仕様変更についてのセッション
マシンのバッテリーが切れてたので、電源がとれつつ前が見えるところを探してたら、最初のほうはあまり聞けなかった。
プログラム言語の一般論を話してた。
Java言語の変更についてだけなんとか。
とりあえず、最初に書いておくと、クロージャーやプロパティ構文の話はありませんでした。
モジュールシステム(スーパーパッケージだったやつ)とアノテーションについてが主でした。

Keyword parameters

充電気にしながら、前が見えるところ探しながら聞いてたので、あいまい。
現状では、アノテーションに関してはキーワードパラメータを使って
@Entity(name="Member")
などとかけます。これを普通のメソッドとかでやるやつ。たぶん。
new Point(x = 3, y = 4);
みたいにする。

Multi catch

catch句にまったく同じものを書いたりしてたのですがそれの対策。
こんな感じのcatchがあるとして

try{ .. }
catch(X1 e){foo();}
catch(X2 e){foo();}
catch(X3 e){bar();}

こうやってまとめれますよ、と。

try{ .. }
catch(X1, X2 e){foo();}
catch(X3 e){bar();}

Safe re-throw

例外を捕まえて再び投げるコードで次のようなのを書くとエラーが出ます。

void m()
	try{
	catch(Throwable e){
		logger.log(e);
		throw e;//error
	}
}

次のように書くことでコンパイル通るようにと

void m()
	try{
	catch(final Throwable e){
		logger.log(e);
		throw e;//ok
	}
}

module対応

Javaのパッケージは名前については階層構造だけど、相互利用というのを考えると階層構造じゃありませんでした。
で、Javaのアクセス指定は、継承を考えなければ、ほかのクラスから見えない・同じパッケージ・どこからも見えるという3段階になっていたので、例えばあるライブラリを作ったときに、そのライブラリの中ではどこからでも使えるけど、ライブラリの外からは使えないというのは無理でした。
そういうことをやろうと思うと、ライブラリのコードをすべて同じパッケージに書かないといけなくて、無理が出ます。
ということで、モジュールシステムというのが導入されて、それに対応するための構文が拡張されます。

module org.netbeans.core;
package org.netbeans.core.util;
module class Sample{
	module int a;
}

という感じでmodule定義を行ってmoduleというアクセス指定を使うと、

module org.netbeans.core;
package org.netbeans.core;
public class A{
	Sample s;
}

のようにおなじmoduleで使えるようになります。
で、今回のセッションでは言ってなかったのですが、その前のGeneral Sessionで、次のようにモジュールの定義ができるということでした。
org/netbeans/core/module-info.javaというファイルを作って次のように。

@Version("7.0")
@ImportModule(name="java.se.core", version = "1.7+")
module org.netbeans.core;

アノテーション拡張

テーマとしては、バリデーションというかユーザー定義エラーチェックのようです。
基本的にJSR308なんですかね。
だらだらコードを書くので、察してください。

List<@NonNull String> strings;
class UnmodifiableList<T> implements @Readonly List<@Readonly T>{
@Interned String s = getName().intern();
@NonEmpty List<String> string = "hello";

Pattern startRegex, endRegex;
if(startRegex != null){
	endRegex = (@NonNull Pattern)endRegex;
	..
}

Graph g = new Graph();
..なにか処理
//もうgの変更はない
@Immutable Graph g2 = (@Immutable Graph) g;

void marshal(@Readonly Object jaxbElement,
	@Mutable Writer writer) @Readonly
{}

先々やりたいこと

まだやると決まったわけではないのだけど、と。
用語がよくわからなくて、うまく日本語にできないものもあるので、もう、メモのまま。
後付できるリテラル構文ってのは面白いですね。
・abstraction
parallel algorithms
・component adaptation
interface evolution via first-class versioning
delegation / forwarding
extendsion meshotds / scala views
・practical structural typing
see aldrich & malayeri at ecoop 2008
・pluggable literal syntaxes
integration with other langages via jsr 223

やる気がないもの

ユーザー定義の演算子オーバーローディング
マルチメソッド
マクロ
動的型
そういうのがやりたかったら他の言語があるよ、と。