プロが教える店舗&オフィスのセキュリティ対策術

Javaコレクションフレームワークの、クラス型とインタフェース型の使い分けについてですが、

newで作ったインスタンスを、
クラス型に代入する場合と、インタフェース型に代入する場合があるのですが、どちらを優先して使ったほうがいいですか?

※物によっては、インタフェース型しかつかえないとか、どちらでも良い場合とかいろいろあると思います。
また、インタフェース型のほうがメソッドの種類が若干多いですが、抽象メソッドなのでオーバーライドして使うからそれは関係ないのかな。


・本に出てきた例

ArrayList<E> list = new ArrayList<E>();
List<E> list = new ArrayList<E>();

Queue<E> queue = new LinkedList<E>();
LinkedList<E> list = new LinkedList<E>();
LinkedList<E> stack = new LinkedList<E>();

Set<E> set = new HashSet<E>();

Map<E, M> map = new HashMap<E, M>();

A 回答 (1件)

基本的にはインターフェースを使うのがよく、特別な必要があるときのみクラス型の変数を使います。



これは、第一にはインターフェース型の変数を使用していれば、実装にしばられず、必要があれば使用するインスタンスのクラス(実装クラス)を挿げ替えることができるからです。

なお、インターフェースしか使えない、ということはありませんし、実装クラスをインターフェースに代入したからといって使えるメソッドの種類が増えることもありません。


例えば、Queue<E> queue = new LinkedList<E>();のようにQueueインターフェースを使えば、LinkedListに備わっているメソッドの一部は使えなくなりますが、これは「良いこと」とされます。Queueインターフェースを使うことで、このオブジェクトがキューとして使われることが自然に保障され、余計なバグを埋め込む余地が減ったりといったメリットがあるからです。
    • good
    • 0
この回答へのお礼

とても勉強になりました、ありがとうございます。

お礼日時:2009/06/05 09:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!