<< LiveCam | Home | 寒い寒い >>
PR: 転職    お墓    エコ    通販    結婚相談所    シルバー    質屋    葬式    漫画    エステサロン   

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にしておくのが無難。柔軟性は落ちるけど、柔軟性は、それを活用出来る人にしか意味は無いわけで、そうでない人にとっては、逆に分かりにくくなるだけだ。



Re: ArrayListへのダウンキャスト

うう、すごく気になる。そのためのRandomAccessマーカインターフェイスでしょう。 if (list instanceof RandomAccess) { for (int i = 0; i < list.size(); i++) { doSomething((String)list.get(i)); } } else { for (Iterator i = list.iterator(); i.hasNext();) { doSomething((String)i.next()); } }

Re: ArrayListへのダウンキャスト

あ、preとか自分で使う必要があるのですね。

Re: ArrayListへのダウンキャスト

単なる順次アクセスで、そこまでやります? ^^;
一番速そうではありますが。

イテレータに恐れおののくレベルの人に、いかに良質なコードを書いてもらうか。これは難題です... 早くJ2SE 5.0がサーバサイドに降りてこないものか。あと4年はかかりそうな感じ。

Re: ArrayListへのダウンキャスト

イテレータを恐れる人にはLinkedListを使わせないというのが良いのでは。配列の中間に要素を入れたり外したり処理は、そうそうは無い(たいていは最後へ追加)なので。

Re: ArrayListへのダウンキャスト

そう思います。で、結局そういう状況の場合に中途半端にListを使って抽象化しましょうっていうガイドは、不適切だったなぁと。

artonさんが開発の現場で書かれていたような「中策、下策」みたいな、Better(bestじゃなく) practiceみたいなものが、実は現場では必要な気がしています。

Re: ArrayListへのダウンキャスト

初めてコメントします。 今ちょうど上記の件を考えています。 上記のそれとは逆に、String[][]からArrayList<String>へのキャストはできないでしょうか?

Re: ArrayListへのダウンキャスト

String[][]から、ArrayList<String>ですか? ArrayList<String[]>とか、ArrayList<ArrayList<String>>じゃなくて? 二次元に入っているのを、片っぱしから一次元のリストにするということかな。構造がそもそも違うんで、キャストで変換するのは無理だと思います。地道にコピーするか、Arrays.asList()みたいにアダプタパターンで変換するListを作るのが順当じゃないでしょうか。

コメント追加 トラックバック送信
このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8