今回も、前回に引き続き、Project Lambdaの紹介をしていきましょう。
前回はラムダ式について紹介しました。しかし、Project Lambdaによる言語仕様の変更はラムダ式だけではありません。そこで、今回と次回でラムダ式以外の言語仕様の変更についてまとめてみましょう。
実質的final
前回、説明したようにラムダ式は関数型インタフェースを実装した匿名クラスの簡易的な記述法になります。このため、匿名クラスの性質をそのまま引き継いでいます。
その一つにスコープがあります。
匿名クラスは、定義されたメソッドで使用されているローカル変数にはfinalをつけない限り、参照することはできません。
例えば、JavaFXでは、ボタンのイベント処理時に、他のコントロールを参照することがよくあります。このような場合、リスト1の赤字で示したようにイベント処理で参照するコントロールにfinalを付加する必要があります。
リスト1 JavaFXのイベント処理
final TextField field = new TextField(); final Label label = new Label(); Button button = new Button("Update"); button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { label.setText(field.getText()); } });
これに対し、Java SE 8ではfinalを省略できるようになりました。finalを省略された変数を実質的final (Effectively final)な変数と呼びます。