ローカル変数の型 #2

メソッド内で直接クラス名を指定して new しているのに、型の抽象/具象で結合の疎蜜を論じるのは無意味ではないかと思う。
実のところをいうと、メソッド内で生成したローカル変数をわざわざダウンキャストしている例って多分あんまり無いのだよね。それは当然の話で。

Reader reader = new BufferredReader(new FileReader(file));
String line;

while ((line = ((BufferredReader) reader).readLine()) != null) {
    System.out.println(line);
}

こんなの書くくらいなら reader の型を BufferredReader にしたほうが良い。でもって、メソッド内で new しているのであれば、わざわざ抽象型で宣言するメリットって実はあまりない。C#Scala で下記のようにオブジェクトの型を暗黙的に宣言できるけど、明示的に型を書くより結合が蜜になっているかといえば、そんなことはない。

var reader = new BufferedReader(new FileReader(file));
val reader = new BufferedReader(new FileReader(file))

まぁ、本当のところを言えば、ローカル変数なら使うメソッドを宣言してある型であれば十分なわけで、

  • ローカル変数なら具象型で宣言しても問題ない
  • 具象型で宣言したほうが使えるメソッドが多い

ということで、具象型のほうが良いとは言えるかなと。後から、「やっぱりサブクラスのメソッドを使いから型宣言を変更しよう」なんてケースがあるかどうかな気もするけど。