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