K's Atelier

個人的な学習記録

What is the benefit of List interface?

「Listインタフェース型の変数を宣言する理由が分からない」という質問は新人研修ではよく受ける質問の一つ。
よくあるテキストのコードでは,

List<Item> items = new ArrayList<Item>();

というコードを示すところまでで,なぜそういう変数宣言をするのかが示されない気がする。
インタフェース型が真価を発揮するのはメソッドの引数になったところのはずなので,そういうサンプルが欲しい。
以下のItemPrinterクラスのように,Listインタフェースを使った共通処理をくくりだしたい。

package iteration;

public class Item {
    private String name;

    public Item(String name) {
        super();
        this.name = name;
    }
    
    public String getName() {
        return this.name;
    }
}
package iteration;

import java.util.List;

public class ItemPrinter {

    // List<Item>型の内容を表示する。
    static void printList(List<Item> items) {
        for (Item i : items) {
            System.out.println(i.getName());
        }
    }
}
package iteration;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class Example {
    public static void main(String[] args) {

        Item[] itemArray = { new Item("消しゴム"), new Item("鉛筆"), new Item("下敷き") };

        List<Item> itemList = new ArrayList<Item>(Arrays.asList(itemArray));
        ItemPrinter.printList(itemList);

        List<Item> itemList2 = new LinkedList<Item>(Arrays.asList(itemArray));
        ItemPrinter.printList(itemList2);

    }
}