回答編集履歴
1
s/実施的に/実質的に/g
answer
CHANGED
@@ -122,7 +122,7 @@
|
|
122
122
|
}
|
123
123
|
```
|
124
124
|
|
125
|
-
PersonComaratorByAgeクラスがなくなり、Colletions.sortの引数を渡すところで、同じ実装がそのまま書かれました。この場合ですと、使っているところで、どのようなソートをしているかの実装があるので、
|
125
|
+
PersonComaratorByAgeクラスがなくなり、Colletions.sortの引数を渡すところで、同じ実装がそのまま書かれました。この場合ですと、使っているところで、どのようなソートをしているかの実装があるので、年齢の若い順にソートか、とすぐにわかります。余計なクラス定義も無くなりますし、クラス管理もしなくても良くなります。他でも利用とかはできなくなりますが、もし、この場所で使わなければ、特に問題はありません。
|
126
126
|
|
127
127
|
どうでしたか?便利だと思いましたか?ちょっとしたことを書くだけなら、クラス定義が不要になる分、匿名クラスは便利…なように見えます。しかし、実際は別にクラスとしてちゃんと定義して、別の場所でも利用できるようにした方がいい場合もあります。その点は一長一短なので、どちらとも言えないと言ったところでしょう。
|
128
128
|
|
@@ -164,7 +164,7 @@
|
|
164
164
|
|
165
165
|
###もう一つの利点 - 制限付きクロージャー
|
166
166
|
|
167
|
-
さて、匿名クラスおよびラムダ式でかけば、とてもすっきり書けることがわかったと思います。しかし、もう一つの利点があります。それは、**finalまたは実
|
167
|
+
さて、匿名クラスおよびラムダ式でかけば、とてもすっきり書けることがわかったと思います。しかし、もう一つの利点があります。それは、**finalまたは実質的にfinalなローカル変数を内部で使用できる**ということです。
|
168
168
|
|
169
169
|
実行するときに引数"-r"をつけると年齢が高い順になるよう、プログラムを書き換えて見ましょう。
|
170
170
|
|
@@ -193,9 +193,9 @@
|
|
193
193
|
|
194
194
|
変数`order`は"-r"がなければ`1`、あれば`-1`になります。そして、変数`order`がラムダ式の中でも使えていることに注目です。これは匿名クラスであっても、同様に使用できます。このようにfinalなローカル変数を内部で使用することができます。普通のローカル変数以外にも仮引数であっても同様に使用可能です。このような仕組みを**クロージャー**といいます。クロージャーが何かを説明すると、また、LISPの歴史から始めることになりますので、ここでは割愛しておきます。
|
195
195
|
|
196
|
-
しかし、Javaのクロージャーには制限があります。それは、変数がfinal、または、実
|
196
|
+
しかし、Javaのクロージャーには制限があります。それは、変数がfinal、または、実質的にfinalで無ければならないと言うことです。実質的にfinalとは、宣言時にfinalがなくても、finalが付いているものとして見なすことができるものを言います。暗黙的なfinalがついていると言った方がいいでしょう。なお、実質的にfinalなローカル変数に代入しようとすると、ラムダ式や匿名クラス内部での使用と矛盾するため、コンパイルエラーになります。(※5)
|
197
197
|
|
198
|
-
※5 このfinalまたは実
|
198
|
+
※5 このfinalまたは実質的にfinalという制限は、Java特有のもので、ほとんどの言語のクロージャーではそのような制限がありません。そのため、私は個人的に、Javaのこの機能はクロージャーでは無く、クロージャー擬きと考えています。
|
199
199
|
|
200
200
|
最後に、ラムダ式や匿名クラスを使わずに、別のクラスにする書き方だった場合はどうなるのかを示しましょう。
|
201
201
|
|