2012年2月16日木曜日

PlayのControllerはJavaじゃない。その1

Playはとても面白いフレームワークだと思う。
ソースもまぁまぁ読んだけど、「やりすぎ。。。」と思うくらい作りこんであるところと「え?こんなあっさりした実装で良いの???」と思う部分のバランスがなんだか不思議な感じ。
久々にソースを読んで感心もしたし、徹頭徹尾ユーザーが「簡単に」Webアプリを作れるように工夫を凝らしていると思う。

そんな中でコントローラは特にやりすぎな方の例でJavaを長くやってきた身からするとそんなんありかよ?と思う部分がかなりある。
ここではそういう部分についていくつか書いておきたい。

まずはその1

staticオブジェクトにアクセスしているのにスレッドセーフ
PlayではHTTPアクションをControllerクラスのサブクラスを作ってそこにstaticメソッドとして定義する。
例えばHelloworldならこんなメソッド定義になる。

public static void hello() {
    renderText("Hello world");
}

とても簡単。
しかし、見ての通りパラメータやセッションなどの情報はどこからも渡されていない。
パラメータについてはメソッドの引数として定義すればそれがそのまま使えたりもするんだけれど、sessionやparamsオブジェクトにはstatic変数を介してアクセスできる。

public static void hello2() {
    String name = params.get("name");
    renderText("Hello " + name);
}

ちょっと待て!って思うよね?
HTTPリクエストなんかはマルチスレッドでパラに動くはずなのにstatic変数なんか使ったらスレッドセーフにならないじゃん。

ところが、これなんとClassLoaderレベルで小細工していてClassロード時にstatic変数をThreadLocalな変数に差し替えている。
つまりコードを見る限り明らかにstatic変数なんだけど、実行時には自動的にThreadLocal変数になっているという荒技。。。(--

もう、この時点でJavaではないと思う。(^^;;;

0 件のコメント:

コメントを投稿