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が浸透するまで待つとか(^_^;