結論:結局、Javaはクロージャを使えるの?

【追記 2008/7/2】とても昔のClosureについて書いた記事が注目を集めてしまったみたいですが、ぜひ、もっと後で書いた次の記事とその関連スレッドの方も確認してみてください。このときよりも、もう少し事情が分かってから書いたものなので、より正確に状況を理解できると思います。それに、私自身、この言葉にはまだ混乱しています・・・
http://d.hatena.ne.jp/lethevert/20070524/p2

      • -

という問いに対して、そろそろ私の結論を整理しておきます。
これは、将来の自分に対する参照の便のための整理です。

前提知識

前提知識として、こちらの内容を読んで理解しておきます。
Closure (computer programming) - Wikipedia
[id:lethevert:20060119:p1]
[id:lethevert:20060121:p2]
また、Lispという違うパラダイムの言語の概念であるものを、適用しようというのだから、それなりに無理があるということも留意しておきます。

クロージャとは?

静的スコープのこと。フリー変数をその変数が字句上で定義された環境に束縛すること。
SchemeがAlgolから取り入れた言語仕様だが、手続きが第一級であるLispにおいて、静的スコープを実現することは他の言語にはない独特の挙動を示すことになり、そのため、特に第一級の手続きが成立している言語における静的スコープのことに限定して、クロージャという用語を使う場合が多い。
(注:以下でクロージャという言葉を使うときは、第一級の手続き、または、第一級のオブジェクトが成立していることを前提とする)

オブジェクト指向との関係

変数や手続きに型を持たない言語において、クロージャとオブジェクトは等価な機能を持つ。
変数や手続きに型を持つ言語では、等価ではない。なぜなら、オブジェクトのメソッドは異なる型と個数のパラメータと返値を持つことができるが、そのようなものに手続きとして静的な型を与えることは無理であるため。

Javaの内部クラスはクロージャか?

静的スコープが成立しているため、クロージャといって差し支えない。

Javaのローカルクラスがfinalでない変数にアクセスできない制限について

ローカルクラスがfinalでない変数にアクセスできないからといって、クロージャではないということにはならない。
ローカルクラスがfinalでない変数にアクセスできないのは、ローカルクラスという機能に対する制限であり、静的スコープという機能に対する制限とはいえない。一般に、ソース中のどの場所でどういう種類のシンボルにアクセス可能であるかということと、静的スコープが成立するかどうかということは、直接的な関係にはない。