鈍器本の自前vectorをJavaで実装(修正版)
上の記事のコードについて、師匠から色々とツッコミをもらったので修正しました。
敗北っていってるのにこの追い討ち! さすがです! (勉強になりました…)
マイナス点をゼロにしただけで、前回実装できなかった箇所についてリベンジできたわけではありません。。。
- 修正版のコード https://gist.github.com/1541121
修正メモ
cloneメソッドを削除
もしVectorModokiでcloneメソッドをオーバーライドするのであれば、cloneメソッドの中で、VectorModokiのフィールドすべてのディープコピーをする必要があります。しかし、VectorModokiで扱うオブジェクトのすべてがcloneを持っている保証はありません。このあたりは、Effective Javaを読み返しつつ再考したところ、納得できました。
そもそもcloneメソッドをなぜ書いたかというと、C++のoperator=オーバーライドを、Javaでエミュレートしたかったからです。といっても、そんなことはJavaの言語機能的にムリです。所詮できないことは、やらないことにしました。
cloneメソッドのオーバーライドをやめたことに伴い、エラーを握りつぶすなど行儀の悪いことをしていた箇所も削除できました。
C++版とJava版の動作に関するマッピングのミスを訂正
Javaでは「ある型のためのメモリを確保だけして、初期化はしない」という、C++のallocator::alocateのような操作ができません。
(NullObjectで初期化する等の手を使わない限り)エミュレートしようがないものを、でたらめにエミュレートしようとしていたのは、間違いでした。
テストコードを追加
手を抜いてスイマセンでした。
その他
インデックスアクセスの範囲外エラーで、ArrayIndexOutOfBoundsExceptionをnewして投げることは、問題ないようです。オレオレデータ構造であるVectorModokiに、Array用のExceptionを流用していいのん?と思っていたのですが。
ただし、より正しいコードにするには、IndexOutOfBoundsExceptionを継承したVectorModokiIndexOutOfBoundsExceptionを作り、それを投げるのがよいでしょう。
そんな感じです。