teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

s/実施的に/実質的に/g

2017/01/08 01:37

投稿

raccy
raccy

スコア21784

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または実的に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、または、実的にfinalで無ければならないと言うことです。実的にfinalとは、宣言時にfinalがなくても、finalが付いているものとして見なすことができるものを言います。暗黙的なfinalがついていると言った方がいいでしょう。なお、実的にfinalなローカル変数に代入しようとすると、ラムダ式や匿名クラス内部での使用と矛盾するため、コンパイルエラーになります。(※5)
196
+ しかし、Javaのクロージャーには制限があります。それは、変数がfinal、または、実的にfinalで無ければならないと言うことです。実的にfinalとは、宣言時にfinalがなくても、finalが付いているものとして見なすことができるものを言います。暗黙的なfinalがついていると言った方がいいでしょう。なお、実的にfinalなローカル変数に代入しようとすると、ラムダ式や匿名クラス内部での使用と矛盾するため、コンパイルエラーになります。(※5)
197
197
 
198
- ※5 このfinalまたは実的にfinalという制限は、Java特有のもので、ほとんどの言語のクロージャーではそのような制限がありません。そのため、私は個人的に、Javaのこの機能はクロージャーでは無く、クロージャー擬きと考えています。
198
+ ※5 このfinalまたは実的にfinalという制限は、Java特有のもので、ほとんどの言語のクロージャーではそのような制限がありません。そのため、私は個人的に、Javaのこの機能はクロージャーでは無く、クロージャー擬きと考えています。
199
199
 
200
200
  最後に、ラムダ式や匿名クラスを使わずに、別のクラスにする書き方だった場合はどうなるのかを示しましょう。
201
201