ArrayListがタイプセーフでないので考えた
クラス内部では、ArrayListを使わざるを得ないためキャストを使うけど、
クラス外部では、タイプセーフにしたい。
ひとまず以下のように考えてみた。でも一つ問題がある。
class HogeHoge { ArrayList fooArray = new ArrayList(); public Foo getFoo( int index ) { return (Foo)fooArray.get(index); } public int getFooSize() { return kyougouMotoArray.size(); } public void addFoo( Foo foo ) { fooArray.add( foo ); } public static int main( String[] args ) { // 繰り返しはできるけど・・・ HogeHoge hoge = new Hoge(); for( int i = 0; i < hoge.getFooSize(); i++ ) { Foo foo = hoge.getFoo( i ); } return 0; } // Iterator を渡すと、削除できてしまうので困る時がある // ArrayListを渡すと、任意のオブジェクトを追加できるから困るし・・・ public static void iteration( Iterator ite ) { ite.remove(0); } }
ArrayList自体を渡したい場合とか。
しかしArrayListに対しgetter()を作ると、外部から任意のオブジェクトをセットできるためタイプセーフにする意味がなくなる(T_T)
またIteratorでは削除可能なので、知らないところでデータが消されてしまう場合がある。
そんなときに、stlのような追加削除できないイテレータがあれば・・・と思ったらふと気がついた
Foo[]を返すことで解決しました
ArrayList::toArray()で配列に変換して返せばやりたいことが達成できるなっと。
class HogeHoge { ArrayList fooArray = new ArrayList(); public Foo getFoo( int index ) { return (Foo)fooArray.get(index); } public int getFooSize() { return kyougouMotoArray.size(); } public void addFoo( Foo foo ) { fooArray.add( foo ); } /** 解決法 */ public Foo[] getFooArray() { return (Foo[])fooArray.toArray(Foo[0]); } public static int main( String[] args ) { // これで他のメソッドにも渡せる HogeHoge hoge = new Hoge(); Foo[] fooAry = hoge.getFooArray(); for( int i = 0; i < fooAry.length; i++ ) { Foo foo = fooAry[i]; } return 0; } }
それとも、Java5.0が浸透するまで待つとか(^_^;