日々常々

ふつうのプログラマがあたりまえにしたいこと。

Interfaceの存在理由

Interfaceが何のためにあるのかと聞かれたので書いてみる。
Javaについて詳しくない方向けに軽く砕きつつ、方向を間違えないように注意しつつ、と思って書いては見たものの結局人に説明できるほど自分も理解していないなと痛感してしまった。要精進、として残しておきます。


まずInterfaceとは、言葉のとおりインタフェースです。境界とか接続面とかそういう言葉で問題ないと思います。それを使っているものが外部に開いている部分を示したものです。現実世界でのインタフェースにも色々あります。例を出すと「ボタンは押すもの」「ドアは開けるもの」などになるのでしょうか。ボタンという存在はそれだけで、押していいものかどうかは別として、押すことは出来ます。押せないボタンはボタンではありませんし、開かないドアはドアではありません。それらしき別の何か別のものです。
Interfaceを実装しているClassは、定義されているメンバが公開されていることを保証します。実装していないからといって、そのメンバが存在しないというわけではありませんが、実装していれば必ず存在します。
ぱっと思い浮かぶものとして、java.lang.Runnableがあります。Runnableにはrunメソッドが定義されており、実装しているClassには必ずrunメソッドが存在します。そしてrunメソッドを使用するClassとしてスレッドを作成するjava.lang.Threadがあり、Runnableを実装しているClassはスレッドとして実行することが出来ます。スレッドの起動には様々な問題点を考慮しなくてはなりませんが、それらの問題点は大抵同じものであり、議論、研究されて既に多くの人に適応した形で存在しています。その辺りの複雑なことを済ませてくれているのがこのThreadです。スレッドを実行、また終了するための難しいことはThreadがやってくれますが、スレッドで実行したいことまでやってくれるわけではありません。その実行したいことを書く場所として空けられているのがrunメソッドであり、スレッドを使用したい人はRunnableを実装したClassにやりたいことを記述するだけで、ある程度安全に、それほど悩み無くスレッドを作成することが出来ます。
というのが、Interfaceを使おうとする人向けになされる説明でしょうか。ここから既存APIの再利用とか云々の話になると誤った理解が出来る気がします。そうではなく、ここでの主役はどちらかというとThreadのほうだと思います。Threadは、Runnableを実装していさえすればClassが何であれスレッドとして実行させることが出来る、ということになります。大事なのはこっちです。
話は戻りまして、Interfaceが何のために存在するものかといいますと、ひとつの答えは実装を隠蔽するためのものです。隠蔽すると何がうれしいのかというと、先に挙げたThreadから見たRunnableの存在のようなものです。Runnableがあるおかげで、Threadが様々な場所で使用できます。

Interfaceで定義されていないpublicなメンバが存在する必要はないとか、思ったり。