Java 7 以前
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/11/26 23:59 UTC 版)
Java 7 以前では、メソッド内部に「ローカルクラス」あるいは「匿名クラス」を定義することで似たようなことができる。ローカルクラス/匿名クラスからは、そのメソッドの final (リードオンリー)なローカル変数を、ローカルクラス/匿名クラスのフィールドと名前が衝突しない限り、参照できる。 class CalculationWindow extends JFrame { private JButton saveButton; ... public final void calculateInSeparateThread(final URI uri) { // The expression "new Runnable() { ... }" is an anonymous class. Runnable runner = new Runnable() { void run() { // It can access final local variables: calculate(uri); // It can access private fields of the enclosing class: // Always update the Graphic components into the Swing Thread SwingUtilities.invokeLater(new Runnable() { public void run() { saveButton.setEnabled(true); } }); } }; new Thread(runner).start(); }} 要素が1つの配列を final な参照で保持すれば、クロージャで1つのローカル変数を参照する機能をエミュレートできる。内部クラスはその参照の値そのものを変えることはできないが、参照されている配列の要素の値は変えることができるからである。このテクニックはJavaに限ったものではなく、Pythonなど似た制限を持つ言語でも有効である。 Javaに完全なクロージャを追加するという言語拡張が検討されていた。様々な問題により、クロージャを導入せずに、関数型インタフェースを実装するための簡便な表記法(ラムダ式)が Java 8 にて導入された。
※この「Java 7 以前」の解説は、「クロージャ」の解説の一部です。
「Java 7 以前」を含む「クロージャ」の記事については、「クロージャ」の概要を参照ください。
- Java 7 以前のページへのリンク