ArrayListへのダウンキャスト
void foo (List list) {
List myList = (ArrayList)list;
for (int i = 0; i < myList.size(); i++) {
String data = (String)myList.get(i);
...
}
}
みたいなコードに「ダウンキャストやめようね」というガイドをしたりしていたのだけど、良く考えてみると、これってあまり良くないガイドだったかもしれない。
最初見た時はArrayListにキャストしてるくせに、List型の変数に格納していて「なんじゃこりゃ、キャスト無意味」と感じたのだけど、
確かにダウンキャストを外すと抽象度は上がる。けどループがこのままでLinkedListなんかを渡された日には、動くかもしれないけど地を這うような遅さになる事が確定している。それなら敢えてキャストを残してClassCastExceptionで落とした方が、まだマシかもしれない。
ループもイテレータを使うようにガイドをするのが、一番まっとうではあるし、そこについてこれる人には、そうガイドすべきだ。でも、そうじゃない人にとっては多分イテレータって分かりにくいというか、しきいが高いんだろうな。単に可変長の配列が欲しいって感覚だと。
多分、次善策は、
void foo (ArrayList list) {
for (int i = 0; i < list.size(); i++) {
String data = (String)list.get(i);
...
}
}
なのだろう。中がArrayListの性質に依存しているんだから引数もArrayListにしておくのが無難。柔軟性は落ちるけど、柔軟性は、それを活用出来る人にしか意味は無いわけで、そうでない人にとっては、逆に分かりにくくなるだけだ。





