【Java】インターフェースには2つの意味がある

徒然草2.0
Document Management System (DMS) being setup by IT consultant working on laptop computer in office. Software for archiving, searching and managing corporate files and information. Business processes

個人的な学習メモです。

Javaのインターフェースは何のためにあるのか?

クラスのメソッドを事前に定義するものだと理解していた。もしくはメソッド一覧みたいなものだと理解していた。しかし、それはインターフェースなるものの解説の”一面”であって本質ではないのではないか。(というかこれだけだと言葉足らずではないか)インターフェースは設計図であるという人もいるが、クラスもオブジェクトの設計図と言われることがある。

インターフェースはメソッドの設計図で、クラスはオブジェクトの設計図だと言えるかもしれないが、それではオブジェクトにはメソッドを内包するので、インターフェースの設計図はやはり不要である。

この辺りを正確に捉えるには、やはり言葉を多くしないといけないし、自分なりに言葉を超えたイメージをしないと分からない部分である。言葉を記憶するような思考をする人はちょっとつらいと思うから図で描くほうがいいだろう。いずれにしても「インターフェースは設計図のようなものだ」というのは説明する言葉がかなり不足しているのではないだろうか(汗)

結論から

結論から言うとインターフェース=設計図ではあるが、

インターフェースにはそもそも2つの意味がある。

つまりは、

インターフェース = 機能の契約 + 抽象的な型

これをもっと分かりやすく具体的に言うと

機能の契約=何のメソッドを使えるか?

抽象的な型=オブジェクトの型が定義される。

⋯ということになり(これでもピンとこない話だと思うが、)ようは、Javaの実行環境に”動物”インターフェースが定義された場合、動物という概念がJavaの実行環境に登録されたことを意味する。

概念ということは実体として動物がインスタンス化されているかどうかは問われないということだ。

話をさらに動物という概念で具体的に説明をしてみます。

動物インターフェースを例に考えてみる

動物インターフェースAnimalを作成する。

具体的にAnimalクラスの契約は2つあり、機能の契約=「動物は鳴く」と抽象的な型=「Animalという動物型」が定義される。

インターフェースの例

public interface Animal {
    void makeSound();
}

クラスの実装( = implements)

public class Dog implements Animal {
    public void makeSound() {
        System.out.println("Woof!");
    }
}

public class Cat implements Animal {
    public void makeSound() {
        System.out.println("Meow!");
    }
}

動物インターフェースと同じ型を持つ、異なるクラスを定義することができる。この例では、動物インターフェースをつかって、犬と猫を実装(implement)した。犬と猫は、ともに”鳴く”メソッドを持つ動物である。

パッケージにおいて同一のクラス名またはインターフェース名は定義することができないが、言い換えると動物型はこのパッケージ内において1つのみである。したがって、動物型なるものが定義されたと言える。

同一のパッケージ何という制約があるので厳密には違うが、Javaという実行環境において「動物という生き物」がいる(概念がある)そして「動物は鳴く」という2つの意味が与えられた、ととらえるとしっくりこないだろうか。

まとめ

インターフェース化とは、実装されたクラスのメソッドをあらかじめ定義する仕組みというよりも、実行時にオブジェクトの存在自体(概念)を実行時に登録をする機能であって、その前提を踏まえて登録した概念のメソッド名が決められているのである。

世界を(JVM環境(パッケージ))とすると、、、「動物がいる」+「動物は鳴く」という、2つの意味を世界に登録するのが、インターフェースである。

※補足:(DI含む)SOLID原則やデザインパターンにおいてインターフェースは重要な意味をもつが、インターフェースを文字通り”境界”やメソッドを約束するもの設計図ぐらいの認識でいると、正しい理解が難しいのではないか?。少なくとも私はインターフェースの重要性を理解できなかったので、インターフェースが重要だと思ったことをまだ正しく知らない人に強調したい。プログラミング初学者の頃、インターフェースがオブジェクト指向における便利な機能ぐらいの認識でいたが、変更に強い設計を意識した場合に非常に重要な概念だが、そのように捉えにくいものではないだろうか?

switch文や継承もしくは同じクラス内にメソッドを書いて分岐させる処理をごりごり書いて、今すべき仕事を終わらせてしまうことがFramework主流の時代には少なくなったのかもしれないが、気づいた時に複雑なコードに頭を抱えて逃げ出したくなる詰みを回避するためにも、先人の知恵をた出しく学びたい。

徒然草2.0
スポンサーリンク
シェアする
gomiryoをフォローする
ごみぶろぐ

コメント

タイトルとURLをコピーしました