せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Java】Javaでの「関数渡し」の実現方法。 パーフェクトJava学習感想文 その4

パーフェクトJavaを読んで改めてJavaを振り返り中。

パーフェクトPHP  ⇒0.5キロ減
パーフェクトRuby ⇒2キロ減
今度は何キロ痩せるかな。

子供を産んでも体重が変わらなかった私からすると、
「体重が落ちる」なんて、かつてない経験。。


 
経緯については学習記録その1をご参照ください。

以下、学んだこと。

 

「変数」と「オブジェクト」の型

Base my = new My();

改めて変数とオブジェクトを理解した上で見ると、
上のコードは
・変数(箱)の型がBase
・オブジェクト(中身)の型がMy
と言っているわけで。
なるほど。

呼ばれるメソッドの実体は、
 
隠蔽時:変数の型で決まる
オーバーライド時:オブジェクトの型で決まる

なるほど。

 

JavaにはCollections#binarySearchメソッドが存在する。

知らなかった!

Rubyにもあるのかなと調べてみたら、
2.0からArrayクラスにbsearchメソッドが追加されたよう。
http://ruby-doc.org/core-2.0.0/Array.html

知らなかった。
ソートのアルゴリズムも勉強したし、効果的に使ってみよう。


 

Javaでの「関数渡し」の実現方法

Javaは関数(メソッド)だけを取り出して引数に渡すことができないため、
関数メソッドを持つインタフェースを定義して、その実装オブジェクトを
引数パラメータで渡すことで高階関数の処理を実現するのが定石です。

なるほど!

こういう、「特定のメソッドを渡すことを目的としたオブジェクト」を
ファンクタ という。
なるほど。

例えば独自のsort処理を定義する場合、
compareメソッドを定義したクラスのオブジェクトを引数に渡すけれど
言われたら確かに関数渡し、という形にもみえる。


 

クラスとインタフェースの多態性

クラスの拡張継承
 ⇒多態性と同時に実装コードも共有
 
インタフェースの継承
 ⇒多態性の共有のみ。より純粋な多態性ということも出来る。

なるほど。

インタフェースを使う意味

「期待する振る舞いを持つ型」であることを表明できる。
「振る舞い」であって実装ではない。
いままでこの違いを意識的に区別したことなかった。。