変数宣言はインタフェースを使った方がよいのか

世の中Java8で盛り上がっているなか、いろいろコード見ていたら、自分のコードの書き方が昔と変わったなぁと思ったので。

 

Javaを書き始めたころ(10年前くらい)は、変数宣言はインタフェースを使うように心がけていました。

周りのコードがそうだったのと、インタフェースで書いて抽象化しておいた方が、変更に強くなるからといった意識でした。

List<String> names = new ArrayList<String>();

けど、気が付いたらいつしか普通に使いたいクラス(実装(具象)クラス)の型で宣言するようになってました。

ArrayList<String> names = new ArrayList<String>();

こう変化した理由は下記だと思っています。

  1. コード補完が効きずらい(右辺の候補は左辺のクラスになるので)し、最初から対応するインタフェースが思いつかないときがある。
  2. 抽象化が必要ならば、必要になった時に変えればよい(最初から必要だとわかっているならば最初からやるけど)。
    IDE使っていれば、変えることにあまり手間はないので。
  3. インタフェースより実クラスで宣言した方が、その変数の情報が多い(型が明示的に分かった方がどういったクラスかわかるので)。
    ただ、インタフェースにすることにより、明示的にその変数で必要な機能が絞られるという意味では、逆の場合もあるかも。(ただ、自分は前者)

そもそも、例にあげているようなローカル変数だと、抽象化もなにも無いような気がしますが、、、メソッド引数なども、実クラスで書くように変わってきています。

ちなみに、この程度の話は、好みだと思いますし、決めが必要であるならば、プロジェクトなりで統一されていればよいと思います。が、抽象化が必要かどうか見えていないところで、なんでもインタフェースで書くべきだと言うのはやりすぎかなぁと思っています。