Javaにもとうとうクロージャ 62
ストーリー by yoosee
どんどん膨れていく… 部門より
どんどん膨れていく… 部門より
zonkerman曰く、"MYCOMジャーナルにタイトルそのままで
ついにJavaにもクロージャ? - James Gosling氏らJDK7へ導入提案
という記事。とうとうJavaにクロージャが提案され、
順調に標準化、実装が進んだとして、2008年にはお目見えとなる
可能性があるようだ。Goslingらの提案した
ホワイトペーパも参照。
Javaの特徴としてクロージャがないというのも主要な一つであるが、
それが用意されることで支持する開発者も多いだろうし、複雑になる
ということで支持しない開発者もいるだろう。
この行方は言語マニアには見物である。"
Javaそのものは変えないとか (スコア:3, 興味深い)
Genericsもクロージャも、頑張ればそれ以前のJavaで書けないこともない感じですし。
ちょっと便利悪くてもひたすら手堅く上品に必要最小限の言語仕様にこだわってる感じが、Javaってかっこいいな、と思ってたので。逆にC#はちょっと下品でも、思いつく限りどこまででも便利にしたろう、みたいな。
どっちの思想も面白いので並列して欲しいなぁ、と。似たような言語2個になるよりはそっちの方が面白そうなので。
#現場にいないので好き勝手に言ってみるテスト
Re:Javaそのものは変えないとか (スコア:2, すばらしい洞察)
うろ覚えですが,初期はJava1.5のclassファイルは1.4のJVMでも動いていたと思います.
多分クロージャも内部匿名クラスのシンタックスシュガーになるのではないでしょうかね.
それなんて cfront ? (スコア:1)
脳みそが硬直化してる?
屍体メモ [windy.cx]
Callbackインタフェース用意するだけじゃダメ? (スコア:3, 参考になる)
Object execute(Object[] data);
}
みたいなjava.lang.Callbackインタフェース用意してくれるだけで、クロージャの代わりになると思うんだけど。
final Target target = ...
obj.doSomething(new Callback() {
Object execute(Object[] data) { return target.doThis(); }
});
みたいな感じでクロージャ。
Re:Callbackインタフェース用意するだけじゃダメ? (スコア:5, 参考になる)
・書き方がClosureに比べて明らかに冗長
・そもそも引数が増えたら新しいインターフェースが必要
・レキシカル・スコープを備えていない。finalでないといけないとか。
といった理由でみんな挫折していった結果今に至るんだと思います。
匿名クラス自体は、Swingでプログラムしている人はみんな今でも使ってますけどね。
スコープ問題は手段を選ばなければ回避可能なのでともかくとしても、記述の冗長さが一番の問題でしょうね。そこまでするなら他の方法使ったほうが早いよ、となってしまうから。
Re:Callbackインタフェース用意するだけじゃダメ? (スコア:3, すばらしい洞察)
といった問題点があります。
確かに今までもクロージャー的なことはできたのですが、今回の提案はクロージャーという仕組みそのものよりも、関数型や構文が大きいと思います。
言語設計としては、従来の名前ベースの型付け(同じ内容でも名前が違えば違う型)に、内容ベースの型(内容が同じならば同じ型)を入れるというのは結構大きな変更だと思います(技術的な話ではなく、設計思想として)。
Re:Callbackインタフェース用意するだけじゃダメ? (スコア:1, すばらしい洞察)
戻り値や引数も自分で決めたいとか。
タプルとかwhere構文も欲しい (スコア:3, 興味深い)
タプルとかwhere構文も欲しいな。
where構文があると
みたいに結論を先に書いて詳細を後に書くような書き方ができる。
大きなメソッドを分割するときもローカル変数を引数として1つ1つ渡さなくていいし。
命令型言語とは相性はあまり良くありませんが。
クロージャは並大抵の苦労じゃ実装できないらしい。 (スコア:2, おもしろおかしい)
誤記 FireFox
巫女 Firefox [mozdev.org]
実装できた暁には (スコア:2, おもしろおかしい)
と声をかけるとよろしかろう。
MIYAZAKI Yasushi
確かに苦労してるっぽい (スコア:2, 参考になる)
> ここ [hatena.ne.jp]に書いてありました。
jscでコンパイルしてディスアセンブルしてみました。
クロージャ部分コンパイルされてないじゃん!!
コラッ (スコア:1, おもしろおかしい)
としか書いてないじゃないか!
Re:クロージャは並大抵の苦労じゃ実装できないらしい。 (スコア:1)
Re:クロージャは並大抵の苦労じゃ実装できないらしい。 (スコア:0, おもしろおかしい)
#無粋なのでAC
クロージャは並大抵の苦労じゃ導入できないらしい。 (スコア:1)
「クロージャを今さら Java 言語仕様に導入するのは並大抵の
苦労じゃないらしい。」とすれば良かったのに。
先月 Java Champions に加わったばかりの Bruce Tate がブログに
"Java が Ruby から盗むべき10のもの" [rapidred.com] というのを
書いていて、その筆頭がクロージャでした。リストアップすると、
選ばれることは、Java 陣営の危機感を反映しています。停滞して 死を
招くくらいなら、激しく変革して Ruby などの挑戦に対抗しようという
覚悟のほどが伺えます。従って、今後の Java 技術についていくのは多分
並大抵の苦労じゃないですよ。
Re:クロージャは並大抵の苦労じゃ導入できないらしい。 (スコア:1)
トウコはとりあえず「クロージャって何ですか?」的なコメントを予想して
とりあえず解りやすい解説を貼り付けておこう的に書き込んでました。
>"Java が Ruby から盗むべき10のもの"
PHP版があるなら見てみたいですよね
誤記 FireFox
巫女 Firefox [mozdev.org]
Re:クロージャは並大抵の苦労じゃ導入できないらしい。 (スコア:1)
(私も含めて)おおむね駄洒落としか思っていないようだけれど。 Java 陣営から見ると、PHP で書かれた大きなアプリケーションは
構造がしっかりしていなくて保守に苦労する、という話はしばしば
目にするので、当初の生産性に差があることは認識しているものの
さほど強敵とは考えていないようです。きっと VB 上がりの人が
使うものでしょ、みたいな考えが見受けられます。
Re:クロージャは並大抵の苦労じゃ実装できないらしい。 (スコア:2, 興味深い)
using System;
public class A {
public delegate int D();
static public D makeCounter() {
int count = 0;
return delegate{
return count++;
};
}
public static void Main(){
int count = 10;
D counter = makeCounter();
Console.WriteLine(counter());
Console.WriteLine(counter());
Console.WriteLine(counter());
Console.WriteLine(counter());
}
}
コンパイルして逆コンパイル
public static A.D makeCounter()
{
A.<>c__DisplayClass1 class1 = new A.<>c__DisplayClass1();
class1.count = 0;
return new A.D(class1.<makeCounter>b__0);
}
確かにあんまり苦労してなさげだ......
ごめん (スコア:2, おもしろおかしい)
#かなり疲れてるらしい。
C++のクロージャーですが (スコア:2, 参考になる)
iida
使いこなせる人はどれぐらいになるかな (スコア:1, 興味深い)
Re:使いこなせる人はどれぐらいになるかな (スコア:2, 興味深い)
JSR-133のfinalに関する部分を利用しているってことになります。
気づいてないだけの場合もあるですよ。場合によっては。
Re:使いこなせる人はどれぐらいになるかな (スコア:1, すばらしい洞察)
既にJavaを習得して活躍してる人たちはなかなか学ばないでしょうけど(今のやり方で問題ないからね)。
Re:使いこなせる人はどれぐらいになるかな (スコア:1, 興味深い)
複雑すぎるC++へのアンチテーゼであったJavaは、これからどこに向かうんでしょう。
Re:使いこなせる人はどれぐらいになるかな (スコア:1, おもしろおかしい)
Re:使いこなせる人はどれぐらいになるかな (スコア:2, おもしろおかしい)
Re:使いこなせる人はどれぐらいになるかな (スコア:0)
Re:使いこなせる人はどれぐらいになるかな (スコア:2, おもしろおかしい)
妖精哲学の三信
「だらしねぇ」という戒めの心、「歪みねぇ」という賛美の心、「仕方ない」という許容の心
Re:使いこなせる人はどれぐらいになるかな (スコア:0)
そろそろ、同属言語として見れなくなってくるのでしょうか。
Re:使いこなせる人はどれぐらいになるかな (スコア:0)
Re:使いこなせる人はどれぐらいになるかな (スコア:1, 興味深い)
たしか最初はシンタックスシュガーだからバイトコードは変わらないので古いVMでもバッチリ動作しますよってのがウリだったはずなのにね。1.5がリリースされたらいつのまにか動かなくなってたのでガッカリでした。
Re:使いこなせる人はどれぐらいになるかな (スコア:2, 参考になる)
というちょっと隠し気味のコンパイルオプションを使えば
ソースは、5.0でもクラスバージョンをJ2SE1.4で
動くヤツにしてくれます。
ただし、5.0で追加されたクラスやメソッドを使っちゃダメ。
foreach的forとか、AutoBoxingは動いてくれるはず。
Re:使いこなせる人はどれぐらいになるかな (スコア:0)
Re:使いこなせる人はどれぐらいになるかな (スコア:0)
JavaScripterなのでクロージャは書きまくってるけど、Javaで必要かな…?
素人的な質問 (スコア:1)
--- (´-`)。oO(平和な日常は私を鈍くする) ---
素人的な回答 (スコア:5, 参考になる)
単一のメソッドと、複数あるいは単数のパラメータを
持つオブジェクトを*簡潔に*定義、作成できる機能
といえます。
クロージャは継続等の概念とは違って、クロージャで
しか実現できない機能ではありません。
なので上で述べた以上でもそれ以下でもないのです
が、簡潔に定義できるという点がポイントになります。
プログラマは泥臭いコードを好みませんから。(…よね?)
たとえばコールバック関数を登録する場面で、クロー
ジャを用いて簡潔に書くこともできますし、簡潔である
という点を利用して、共通部分を括り出してクロージャ
でまとめることもできます。
同等のことをオブジェクトで実装しようと思えば、結構
グダグダ書く必要があります。少なくてもクロージャの
ように簡潔には記述できません。
#間違ってたらエロい人指摘お願いします。
Re:素人的な回答 (スコア:3, 興味深い)
クロージャはオブジェクトに書き下せます。簡単にできるので
やってみてください。そうすれば書いてあることがわかると思います。
>プリミティブ変数同様、「オブジェクト指向に変なのが混ざった」というのが率直な印象。
もともと関数型言語からの概念なので、その印象は正解かもしれません。
しかし、使いこなせば有用な概念ではあります。その有用性をJavaは選択した、ということでしょう。
Re:素人的な回答 (スコア:1, 興味深い)
OOPとClosureの相乗効果が挙がって嬉しいのは確かなのですが、
もともとOOPとClosureは無関係ですよね。
Closureは関数(C言語じゃなくLispなどの意味での)系言語の得意技。
hoge.map{xxx}.map{yyy}.select{zzz}
みたいな書き方(これはRubyね)をすることでOOPと旨く馴染みはしますが。
Re:素人的な質問 (スコア:2, 参考になる)
繰り返しを抽象化したり、ファイルの閉じ忘れを防止したり、配列のソートの仕方を変更したり、等。
Re:素人的な質問 (スコア:0)
#外部派との派閥争いに勝てればですが。
Re:素人的な質問 (スコア:1, すばらしい洞察)
向いてる用途が違うんだから、使い分けるのが吉であって、つぶしあいをするのは馬鹿。
内部イテレータでリソースのCloseを自動化するってのは美味しいですね。
たとえばDatabaseへのCommit/Rollbackを(ほとんど)意識せずに済むようになるので、すごく美味しい。
逆にDBのFetchは外部イテレータでないと「巻き戻し」が出来なくなる。
要するに、ループ(?)が最後まで進むことを強制したいときは内部イテレータ、進むか戻るかをこっちが自由に制御したければ外部イテレータ、だろうね。
Re:素人的な質問 (スコア:1, 余計なもの)
妖精哲学の三信
「だらしねぇ」という戒めの心、「歪みねぇ」という賛美の心、「仕方ない」という許容の心
Re:素人的な質問 (スコア:2, 参考になる)
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closure [capsctrl.que.jp]
この辺りを読んでみるとどう?
Re:素人的な質問 (スコア:2, 参考になる)
そのページに書いてある説明だと、どうもラムダ式との違いがわかりにくいように感じました。別のコメントにもありますがはてなの記事 [hatena.ne.jp]の方が解りやすかったですね。
That is not dead which can eternal lie,
And with strange æons, even death may die.
Re:素人的な質問 (スコア:1)
クロージャを実装することで正しい動きになったと言うことだと思う。
クロージャを使った設計、実装上の利点については他の方、お願いします。すんません。
ばんざーい (スコア:1, おもしろおかしい)
苦労じゃ (スコア:1, すばらしい洞察)
だれか仕様にくみこんどくれぇ。
もうイヤなんだ。
closureがモノとして扱えるってことは (スコア:0)
そろそろ (スコア:0)
VB.NETにも早いとこくれ (スコア:0)
いちいちメソッドを作らないと(場合によってはクラス
変数の定義もしないと)いけないからめんどくさくてかなわん