回答編集履歴

1 誤記を修正

KiyoshiMotoki

KiyoshiMotoki score 4737

2016/05/19 17:29  投稿

例えば、以下のような利用方法もあります。
```php
```java
public class Main {
   public static void main(String[] args) {
       Drawable someShape = createDrawable("circle");
       drawRichly(someShape);
   }
   private static Drawable createDrawable(String shape) {
       if ("rectangle".equals(shape)) {
           return new Rectangle();
       }
       if ("circle".equals(shape)) {
           return new Circle();
       }
       if ("triangle".equals(shape)) {
           return new Triangle();
       }
       throw new IllegalArgumentException("知らない形状");
   }
   private static void drawRichly(Drawable drawable) {
       System.out.println("今から描画します");
       drawable.draw();
       System.out.println("描画しました");
   }
}
```
メソッドの戻り値や引数をインターフェースで定義すると、
実装の詳細を隠蔽しながら(そのインターフェースを実装した何のクラスをやり取りしているのかを気にすることなく)
インスタンスを引き回せるようになります。
他の用例やもっと突っ込んだ解説を知りたければ、『Effective Java 第2版』などを読んでみることをお勧めします。
[http://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056](http://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056)

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る