- - PR -
AbstractList
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-05-15 19:41
ArrayListを拡張したListを作りたいのですが、方法として
1.ArrayListを継承する。 2.AbstractListを継承する。 3.第3の方法 があるかと思いますが、 これらを選択する際の基準は何でしょうか? ちなみに AbstractListの実装の意図がよくわかっていません。 javadocには、実装の作業量を減らすと書いてありますが、結局 ほとんどのメソッドをオーバーライドしなければいけなくなり ませんか? AbstractListを使用する際の作法があるように思うのですが... そのあたりを教えていただけないでしょうか? よろしくお願いいたします。 | ||||||||
|
投稿日時: 2003-05-15 23:09
unibon です。こんにちわ。
ちょっとチャチャになりますが、 ArrayList の「拡張」ならば、やっぱり ArrayList を元にして 継承(に限りませんが)すべきだろうと思います。 ArrayList に「似たもの」を作るのならば、 extends AbstractList でも、implements List でもありだと思いますが。 もっとも、どのような「拡張」をするかにもよるでしょうが。 基準は、どこまで自分で作り込みたいか、ぐらいで、 それほど拘らなくてもよいように思います。
JDK には AbstractList や ArrayList のソースコードが付属していますが、 それはご覧になられたのでしょうか(src.zip や src.jar の中にあります)。 私は今ちょっと見ただけなのですが、 AbstractList は、iterator メソッドの実装を主にやっていて、 ArrayList は、それ以外の部分の実装をやっているようです。 余談ですが、AbstractList は List インターフェースを implements した、 より具象的なものなのに、なぜ AbstractList という名前になるのかが疑問です。 ALittleConcreteList のような名前のほうが適切のような気がするのですが。 これも余談ですが List と AbstractList と ArrayList の関係は、たとえば、 Swing の TableModel と AbstractTableModel と DefaultTableModel の関係と似てますね。 | ||||||||
|
投稿日時: 2003-05-16 23:12
unibon様、ご享受ありがとうございました。
実は、一番知りたかったことは、タイトルからお察しかと思 いますが、AbstractListの実装方法で、一番望んでいたこと は、そのサンプルでもいただけることでした。 ArrayList.javaがその一番のサンプルということで、目的を 達成できました。 今まで、JDKのソースコードは、私の中でなんとなくアンタッ チャブルな位置付けでしたが、今後はソースも見てから質問 するようにいたします。 おかげ様でいろいろ勉強になりました。 この度は、ありがとうございました。 | ||||||||
|
投稿日時: 2003-05-19 13:03
unibon です。こんにちわ。
自己フォローとして、追加の考察になりますが、 その後、IDE(Eclipse や JBuilder)上で、AbstractList を 継承関係などの点に関してブラウジングしてみました。 すると、ArrayList と Vector で共通にできる部分を AbstractList として汎化しているようにも、一見、感じました。 しかし、本当の意図はおそらく、AbstractList では(そのスーパクラスの AbstractCollection のフィールドである) modCount の管理と、 SubList の管理もおこなっていて、 ArrayList(や Vector)では、それ以外の、 特に ArrayList(や Vector)ならではのフィールド(elementData 等)の管理に徹している、 のだろうと思いました。 なお、なんで AbstractList という名前かという件については、 たぶん、abstract class で、かつ implements List したものだからなんですよね (あたりまえと言えばそうなのですが)。 JDK の標準の API としては Abstract で始まるクラス名のものは数十個ほどありますが、 このようにワンクッション置く(このような abstract な class を継承関係に挟み込む)のが 流儀のようです。 それぞれの役割分担としては、 List などの interface ではメソッドの挙動のみを定義して実装はなく、 AbstractList/AbstractCollection など abstract な class では、 コントローラ的なフィールドとそれに関連するメソッドを実装し、 ArrayList/Vector などの class では、 モデルに相当するフィールドとそれにアクセスするメソッドの実装を おこなっているように思います。 | ||||||||
1
