QA@IT

Javaにおけるインターフェースについて

4456 PV

現在インターフェースについて学んでいます。
なんとなく「インターフェースとはどんなものか」というのはわかったような気がしますが。
インターフェースを使用したい場合はどんな時でしょうか。
この場合ならインターフェースを使うべき。
っていうのはどのような時なのでしょうか。

・インターフェースを使用すると機能改善の時の影響が限られる。
・利用する方は「何をするか」を知っていれば扱える。
・実装の隠蔽化が出来る。
が利点かなぁ。と個人的には思って入るのですが・・・。
あまりピンと来ていません。
よろしくお願いします。

  • iromekiさんは、別にInterfaceが無くてもプログラムするうえで支障はないと考えている。という事なのですか? -
  • 支障はない。
    とは言いません。
    ただ、「これ実装しといて。」と既にあるものを使うことはありますが、
    今まで意識して「これはインターフェースで。」と使用したことがなかったため、
    改めて考えてみたのですが、あまり自分の中でしっくりくる考えが浮かばなかったので。
    -
  • つまり、自分でもinterfaceを設計・定義して見たいけど、どうやって設計・定義すればよいのか分らない。ということですか? -
  • どうやって・・・というか。
    考え方でしょうか。
    そこらへんのサイトに記載されているインターフェースの説明でインターフェースとは質問に書いてあるような感じかなぁ。と思ったんですが。
    じゃあ、実際どのような場合に使用するべきか、どのような場合に使用する価値があるか。がわからないんですね。
    「使い方」ではなくて「使う意味」でしょうか?
    あやふやですいません。
    -

回答

オブジェクト指向における抽象化(逆に言えば具象化)のためには、抽象クラス(abstract class)とインターフェース(interface)がありますが、最初から、プログラムの仕様がきっちり決まっていて、かつ、その仕様が将来に渡って変更がないなら、抽象クラスだけを使ってもオブジェクト指向プログラミングはできますし、むしろそのほうがきれいで見やすいプログラムになると考えます。インターフェースを使わなくてもプログラムは書けます。

しかし、上述のように、プログラムの仕様がきっちり決まっていなかったり、あるいは、仕様が将来、変更がありうる場合は、インターフェースを使ったほうが潰しが効くプログラムになります。良い言葉で言えば、柔軟性を持たせられるということであり、悪い言葉で言えば、あとづけでごちゃごちゃ拡張できてしまう汚いプログラムになるということです。

なお、ご質問を拝見していると、「インターフェースについて」ではなく「インターフェースや抽象クラスについて」というご質問なのかなとも感じました。私は最初は、インターフェースはすっ飛ばして、抽象クラスだけを学ばれても良いと思います。

編集 履歴 (0)
  • acceptさせて頂きました。
    んー。
    やっぱり柔軟性ということなんでしょうか。
    自分が初心者なためunibonさんが1番わかりやすいと感じました。
    ありがとうございました。
    -

単に共通する関数を再利用できるって所ではないでしょうか。
そもそも動的型付言語では要らないので、Javaで関数の再利用を利用するための仕組みと考えておけばよいのではないでしょうか。

次の例を見てください。(細かいclassの書き方は省略します。)
例:
class HelloAction implements
    java.awt.ActionListener
{
  public void actionPerformed( java.awt.ActionEvent event )
  {
    System.out.println( "Hello" )
  }
}

class GoodbyAction implements
    java.awt.ActionListener
{
  public void actionPerformed( java.awt.ActionEvent event )
  {
    System.out.println( "Goodby" )
  }
}

javax.swing.JButton
  button = new javax.swing.JButton( "Button" );

button.addActionListener( new HelloAction() );
button.addActionListener( new GoodbyAction() );

Buttonを表示し、Buttonを押すとHelloとGoodbyをConsoleに出力するという単純な例です。
ここで注目すべきは、この2行です。

button.addActionListener( new HelloAction() );
button.addActionListener( new GoodbyAction() );

HelloActionと、GoodbyActionは、java.awt.ActionListenerを実装していなければbutton.addActionListenerの引数に指定することはできません。button.addActionListenerを実装しているからこそ、button.addActionListenerを、HelloActionとGoodbyActionによって利用できるようになるのです。今回の例では、HelloAction、GoodbyActionそれぞれ大した事をしていないので、あまり価値があるように見えません。ただ、本格的にApplicationを作成する場合は、Fileを開く動作(FileOpenAction)だったり切り取りを行う動作(CopyAction)だったりを登録していく事になります。

今回GUIを例にしましたが、単に文字操作といった場合でも同じように一つの関数を複数のclassで使用しようと思えばinterfaceを利用することができます。
余談ですが、上記の例は、interfaceを使わず実装継承を使ってもできます。敢えて実装継承を使わずinterfaceを使う理由は何かと言われた場合理由は2個あります。
・Javaでは1つのclassで実装継承が1回しかできない。そのかわりinterfaceであれば1個のclassに何回でも実装することが出来る。
・実装継承が必要な場合というのは、super classに何らかの実装が必要な場合だけ。一切実装が必要ないならinterfaceで良い。
その様な事情があり、実装継承を使わずinterfaceを使うことがあります。

編集 履歴 (2)

「結局のところインターフェースってなんなの?」という質問なら、まず前提としてオブジェクト指向をよく理解する必要があります。

大雑把に言えば、オブジェクトとオブジェクトの「接点」を定義するためにインターフェースはあります。
あるオブジェクトにアクセスするときは、そのインターフェースを経由する的な概念があります。

例えば、Firefox(WWWブラウザ)がApache(Webサーバー)にアクセスする様子にたとえると、
まず、FirefoxがApache固有の実装にアクセスすることはありません。
ApacheはHTTPプロトコルに基づいて実装されており、FirefoxはHTTPプロトコルを使ってApacheにアクセスします。
だから、Webサーバーの実体が、ApacheだろうとTomcatだろうと区別なく使えます。

このとき、FirefoxやApacheがオブジェクトで、HTTPプロトコルがインターフェースに相当します。

HTTPプロトコルには、GETメソッド、POSTメソッド、HEADメソッドなどが定義されていますが、その実体はありません。

インターフェースはクラスとは異なります。メソッドの定義のみで実装がない抽象クラスはインターフェースに似ていますが、それはただ単に似ているだけです。
今回の例では、「WWWブラウザ」や「Webサーバー」が抽象クラスに相当します。

正式にオブジェクト指向に基づいて実装するなら、オブジェクトには必ずインターフェースが伴うものです。あってもなくても良いというものではありません。

例えば、デザインパターンについて書かれている”通称GoF24本”でも、オブジェクトにはインターフェースが伴う前提でパターンが解説されています。

編集 履歴 (0)

端的な回答が思いつかないので、具体例を1つ書いてみます。
少しでも参考になれば幸いです。

たとえば、あるインターフェースの実装クラスと未実装クラスが混在した
コレクションを一括処理する場合にメリットが見えてきます。

例として、商品クラスから派生した食品クラス本クラスなどがある場合に、

食品クラス医薬品クラスなら消費期限チェックを行う」

といったロジックを、

消費期限管理インターフェースを実装していれば消費期限チェックを行う」

という風にまとめることができます。

インターフェースは1つのクラスに複数実装できるので、
返品インターフェース自動発注インターフェースなどが増えても
問題なく実装することができます。

編集 履歴 (0)
  • ん?それは、通常とは違う使い方では?interfaceをアノテーション代わりにするということですよね? -

Javaのインタフェースはオブジェクト脳のつくり方の第一部の「社長命令・起立!」の例が分かりやすいです。

古本なら安いのでおすすめです。
EJBの話は読まなくてよいです。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。