`List list = new ArrayList()`と宣言するのはやめたほうがいいのではないか
ベストアンサー選択機能とかは無いようなので、 @mrbonjin さんの回答を転載:
ローカル変数に限れば優れた方法ではないです。
実装(クラス)ではなくインターフェースを用いた方が良い(変更に強くする)のはローカル変数ではなくメソッド引数や戻り値など他の機能との接点になるところです。
Stack Overflowでは具体的な質問以外は禁止とのことなのでQiitaで質問しますが、ArrayList list = new ArrayList()
ではなくList list = new ArrayList()
と書くのは本当に優れた方法なのでしょうか?
例えば英語版stackoverflowでは変化によく対応するためにList list = new ArrayList()
という書き方がいいとされています。もしArrayListではなくLinkedListにした方がいい場合になったらnew ArrayList()
の部分だけ書き変えればいい、と。
しかし、例えば以下のようなコードがあったとします。
List<String> list = new ArrayList<>();
/*
----------------------------------------------
長文のコード
----------------------------------------------
*/
Random rand = new Random();
for (int i = 0; i < list.size(); i++) {
String str = list.get(rand.nextInt(list.size()));
...//processing
}
後任者が宣言文List<String> list = new ArrayList<>();
だけ見て「なるほどこのlist
はListであれば何でもいいんだな。じゃあちょっと挿入処理したい所があるからLinkedListに変えよう」とやったら以下の記事にあるように激遅コードになってしまいます。
軽い気持ちでLinkedListを使ったら休出する羽目になった話 - Qiita
List
に限らず、インターフェイスによる宣言は「そのインターフェイスが持つメソッドはどのような使われ方でも問題ない」場合だけ使うべきではないのではないでしょうか。例えばIterable
インターフェイスなら「すべての要素を走査する」役割しかないので、どんな実装だろうと速度など何か問題が起きることは無いでしょう。