パスワードを忘れた? アカウント作成
13223 story

Javaにもとうとうクロージャ 62

ストーリー by yoosee
どんどん膨れていく… 部門より

zonkerman曰く、"MYCOMジャーナルにタイトルそのままで ついにJavaにもクロージャ? - James Gosling氏らJDK7へ導入提案 という記事。とうとうJavaにクロージャが提案され、 順調に標準化、実装が進んだとして、2008年にはお目見えとなる 可能性があるようだ。Goslingらの提案した ホワイトペーパも参照。
Javaの特徴としてクロージャがないというのも主要な一つであるが、 それが用意されることで支持する開発者も多いだろうし、複雑になる ということで支持しない開発者もいるだろう。 この行方は言語マニアには見物である。"

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2006年08月24日 13時41分 (#1003721)
    Java本体と、シンタクスシュガー的な部分を切り分けたらダメなんでしょうか? 初期のC++コンパイラのように、いったん、クラシカルなJava言語へ変換してから、バイトコードへ落とすようなイメージで。

    Genericsもクロージャも、頑張ればそれ以前のJavaで書けないこともない感じですし。

    ちょっと便利悪くてもひたすら手堅く上品に必要最小限の言語仕様にこだわってる感じが、Javaってかっこいいな、と思ってたので。逆にC#はちょっと下品でも、思いつく限りどこまででも便利にしたろう、みたいな。

    どっちの思想も面白いので並列して欲しいなぁ、と。似たような言語2個になるよりはそっちの方が面白そうなので。

    #現場にいないので好き勝手に言ってみるテスト
  • interface Callback {
      Object execute(Object[] data);
    }
    みたいなjava.lang.Callbackインタフェース用意してくれるだけで、クロージャの代わりになると思うんだけど。
    final Target target = ...
    obj.doSomething(new Callback() {
      Object execute(Object[] data) { return target.doThis(); }
    });
    みたいな感じでクロージャ。
    • それはただのRunnableで、現状すでに使われていて、SmalltalkなどClosureがある言語から流れてきた人がClosureの代わりに使おうとしたけども:

      ・書き方がClosureに比べて明らかに冗長
      ・そもそも引数が増えたら新しいインターフェースが必要
      ・レキシカル・スコープを備えていない。finalでないといけないとか。

      といった理由でみんな挫折していった結果今に至るんだと思います。
      匿名クラス自体は、Swingでプログラムしている人はみんな今でも使ってますけどね。

      スコープ問題は手段を選ばなければ回避可能なのでともかくとしても、記述の冗長さが一番の問題でしょうね。そこまでするなら他の方法使ったほうが早いよ、となってしまうから。
      親コメント
    • by ruto (17678) on 2006年08月24日 14時10分 (#1003750) 日記
      • 型があまり安全でない。
      • 記法が煩雑。
      • 外の変数の参照に制約がある。

      といった問題点があります。

      確かに今までもクロージャー的なことはできたのですが、今回の提案はクロージャーという仕組みそのものよりも、関数型や構文が大きいと思います。

      言語設計としては、従来の名前ベースの型付け(同じ内容でも名前が違えば違う型)に、内容ベースの型(内容が同じならば同じ型)を入れるというのは結構大きな変更だと思います(技術的な話ではなく、設計思想として)。

      親コメント
    • by Anonymous Coward on 2006年08月24日 14時31分 (#1003766)
      それをシンプルに書きたいんじゃ。
      戻り値や引数も自分で決めたいとか。
      親コメント
  • by ruto (17678) on 2006年08月24日 14時29分 (#1003763) 日記

    タプルとかwhere構文も欲しいな。

    where構文があると

    if c then t else e
    where
    c = ...
    t = ...
    e = ...

    みたいに結論を先に書いて詳細を後に書くような書き方ができる。

    大きなメソッドを分割するときもローカル変数を引数として1つ1つ渡さなくていいし。

    命令型言語とは相性はあまり良くありませんが。

  • ここ [hatena.ne.jp]に書いてありました。
    --
    誤記 FireFox
    巫女 Firefox [mozdev.org]
    • 実装できた暁には (スコア:2, おもしろおかしい)

      「うむ、ご苦労じゃ」
      と声をかけるとよろしかろう。

      --
      MIYAZAKI Yasushi
      親コメント
    • by s-tomo (2841) on 2006年08月24日 20時24分 (#1003993) ホームページ 日記
      Javaじゃなくて.NETでスマソ

      > ここ [hatena.ne.jp]に書いてありました。

      jscでコンパイルしてディスアセンブルしてみました。

      .method public instance object Global Code() cil managed
      {
      (略
      ldstr "function makeCounter () {\r\n var count = 0;\r\n return f;\r\n \r\n function f () {\r\n return count++;\r\n }\r\n}"

      クロージャ部分コンパイルされてないじゃん!!
      親コメント
    • コラッ (スコア:1, おもしろおかしい)

      by Anonymous Coward on 2006年08月24日 13時12分 (#1003686)
      リンク先にも「クロージャは並大抵の苦労じゃ実装できないらしい。」
      としか書いてないじゃないか!
      親コメント
    • クロージャを書くのが難しいのか、クロージャをJavaVM上で効率よく実装するのが難しいのか、どっちよ?
      親コメント
    • 惜しい。
      「クロージャを今さら Java 言語仕様に導入するのは並大抵の
      苦労じゃないらしい。」とすれば良かったのに。

      先月 Java Champions に加わったばかりの Bruce Tate がブログに
      "Java が Ruby から盗むべき10のもの" [rapidred.com] というのを
      書いていて、その筆頭がクロージャでした。リストアップすると、
      • クロージャ。
      • コンティニュエーション。
      • メタプログラミング。
      • XML (設定ファイル) よりも慣習。
      • JSP ではない本物のテンプレート。
      • HTML とともに使うためのスクリプト言語。
      • ラッピングフレームワークへの投資。
      • 単純さを重視すること。
      • 積極的な資産管理。後方互換性を破ることを恐れず、悪い特徴を捨て、良いものを取り入れること。
      • 初心者を抱擁すること。Java 開発者が使いものになるまでの学習時間は長過ぎる。
      だいたい、Ruby に軸足を移した Tate 氏のような人が Java Champion に
      選ばれることは、Java 陣営の危機感を反映しています。停滞して 死を
      招くくらいなら、激しく変革して Ruby などの挑戦に対抗しようという
      覚悟のほどが伺えます。従って、今後の Java 技術についていくのは多分
      並大抵の苦労じゃないですよ。
      親コメント
      • vnさんこそ投稿時期が惜しいですね…
        トウコはとりあえず「クロージャって何ですか?」的なコメントを予想して
        とりあえず解りやすい解説を貼り付けておこう的に書き込んでました。

        >"Java が Ruby から盗むべき10のもの"
        PHP版があるなら見てみたいですよね
        --
        誤記 FireFox
        巫女 Firefox [mozdev.org]
        親コメント
        • トウコはとりあえず「クロージャって何ですか?」的なコメントを予想して
          とりあえず解りやすい解説を貼り付けておこう的に書き込んでました。
          そんな奥床しい配慮があったとは....
          (私も含めて)おおむね駄洒落としか思っていないようだけれど。
          >"Java が Ruby から盗むべき10のもの"
          PHP版があるなら見てみたいですよね
          Java 陣営から見ると、PHP で書かれた大きなアプリケーションは
          構造がしっかりしていなくて保守に苦労する、という話はしばしば
          目にするので、当初の生産性に差があることは認識しているものの
          さほど強敵とは考えていないようです。きっと VB 上がりの人が
          使うものでしょ、みたいな考えが見受けられます。
          親コメント
  • ごめん (スコア:2, おもしろおかしい)

    by Anonymous Coward on 2006年08月24日 14時50分 (#1003782)
    Javaにいもうとクロージャって読み違えた。
    #かなり疲れてるらしい。
  • Stroustrup他のLambda expressions and closures for C++ [att.com]という論文、ありましたね。
    --
    iida
  • by Anonymous Coward on 2006年08月24日 13時21分 (#1003699)
    自分がJava言語(特にWebアプリでの)を使い始めたのはJDK1.3からで、その頃はWebアプリ開発にJavaが使われ初めて注目度がグンとアップし、エンジニアが急に増えてきた頃だったと思います。つい先日JDK1.5で稼働するアプリのソースをみたことがあるのですが、1.5で導入された機能を使っている箇所はほとんど無く、1.3/1.4の頃のままでした。思うに、多くのエンジニアが1.3/1.4の仕様で満足している、もしくはそれ以上の機能を導入しなくとも仕事では「問題ない」状態であって、JDKのバージョンがあがっても下位互換がとれていれば使われることはほとんど無いのでは?なんて思ったりします。 かくいう自分もJDK1.5で導入されたGenericisなどの便利な機能を使っていなかったり(苦笑
  • クロージャが実装されると何が嬉しいのん?
    --

    --- (´-`)。oO(平和な日常は私を鈍くする) ---
    • 素人的な回答 (スコア:5, 参考になる)

      by former (29574) on 2006年08月24日 14時24分 (#1003760) 日記
      オブジェクト指向の視点から見れば、クロージャとは
      単一のメソッドと、複数あるいは単数のパラメータを
      持つオブジェクトを*簡潔に*定義、作成できる機能
      といえます。

      クロージャは継続等の概念とは違って、クロージャで
      しか実現できない機能ではありません。
      なので上で述べた以上でもそれ以下でもないのです
      が、簡潔に定義できるという点がポイントになります。
      プログラマは泥臭いコードを好みませんから。(…よね?)

      たとえばコールバック関数を登録する場面で、クロー
      ジャを用いて簡潔に書くこともできますし、簡潔である
      という点を利用して、共通部分を括り出してクロージャ
      でまとめることもできます。
      同等のことをオブジェクトで実装しようと思えば、結構
      グダグダ書く必要があります。少なくてもクロージャの
      ように簡潔には記述できません。

      #間違ってたらエロい人指摘お願いします。
      親コメント
    • Re:素人的な質問 (スコア:2, 参考になる)

      by ruto (17678) on 2006年08月24日 14時20分 (#1003757) 日記
      Rubyのブロック的なことができるようになります。

      繰り返しを抽象化したり、ファイルの閉じ忘れを防止したり、配列のソートの仕方を変更したり、等。
      親コメント
      • by Anonymous Coward
        内部イテレータが使えるのはいいですよね。

        #外部派との派閥争いに勝てればですが。
        • Re:素人的な質問 (スコア:1, すばらしい洞察)

          by Anonymous Coward on 2006年08月25日 15時07分 (#1004671)
          >外部派との派閥争い

          向いてる用途が違うんだから、使い分けるのが吉であって、つぶしあいをするのは馬鹿。

          内部イテレータでリソースのCloseを自動化するってのは美味しいですね。
          たとえばDatabaseへのCommit/Rollbackを(ほとんど)意識せずに済むようになるので、すごく美味しい。

          逆にDBのFetchは外部イテレータでないと「巻き戻し」が出来なくなる。

          要するに、ループ(?)が最後まで進むことを強制したいときは内部イテレータ、進むか戻るかをこっちが自由に制御したければ外部イテレータ、だろうね。
          親コメント
    • Re:素人的な質問 (スコア:1, 余計なもの)

      by YOUsuke (6796) on 2006年08月24日 13時24分 (#1003703) ホームページ 日記
      っていうかクロージャって何?
      --
      妖精哲学の三信
      「だらしねぇ」という戒めの心、「歪みねぇ」という賛美の心、「仕方ない」という許容の心
      親コメント
    • by blackMutou (24312) on 2006年08月24日 13時49分 (#1003730) 日記
      同じ実装でも、クロージャが提供されている言語の動きの方が、より直感的と感じるな。
      クロージャを実装することで正しい動きになったと言うことだと思う。

      クロージャを使った設計、実装上の利点については他の方、お願いします。すんません。
      親コメント
  • ばんざーい (スコア:1, おもしろおかしい)

    by Anonymous Coward on 2006年08月24日 17時22分 (#1003877)
    これで Java のマネが好きな PHP にもついにやっとクロージャが!
  • 苦労じゃ (スコア:1, すばらしい洞察)

    by Anonymous Coward on 2006年08月24日 19時30分 (#1003972)
    本当にクロージャが必要なのはSQLだ。
    だれか仕様にくみこんどくれぇ。

    もうイヤなんだ。
  • by Anonymous Coward on 2006年08月24日 14時41分 (#1003777)
    そこからアクセスされるローカル変数に transientとかvolatileとか付けられるようにしなくてはいけなくなるんですよね。
  • by Anonymous Coward on 2006年08月24日 16時46分 (#1003856)
    Groovy意味ないじゃんと・・・言いたくなってきたこの頃
  • by Anonymous Coward on 2006年08月24日 17時35分 (#1003895)
    いくらジェネリックが使えてもクロージャーがないと
    いちいちメソッドを作らないと(場合によってはクラス
    変数の定義もしないと)いけないからめんどくさくてかなわん
typodupeerror

Stay hungry, Stay foolish. -- Steven Paul Jobs

読み込み中...