封裝ArrayList

轉載請註明出處

http://blog.csdn.net/pony_maggie/article/details/44786233

ArrayList很好用,可以添加任意類型,動態增長,各種庫函數支持,如下是個簡單示例:

public class FillingList {  
  
    /** 
     * @param args 
     * fill只會對已經存在空間填充,所以下面的for循環必不可少 
     */  
    public static void main(String[] args)   
    {  
        // TODO Auto-generated method stub  
        List<String> list = new ArrayList<String>();  
          
        for (int i = 0; i < 10; i++)   
        {  
            list.add("");  
        }  
          
        Collections.fill(list, "hello");  
        System.out.println(list);  
  
    }  
  
} 
它存在一個問題,就是不知道add進來的類型。因爲add方法本身接受的是Object類型,當我們取出來列表中的內容使用時,需要強制轉換實際的類型,如下所示:

public static void main(String[] args)   
    {  
        ArrayList cats = new ArrayList();  
        for(int i = 0; i < 7; i++)  
        {  
            cats.add(new Cat(i));  
        }  
          
          
        for(int i = 0; i < 7; i++)  
        {  
            ((Cat)cats.get(i)).print();  
        } 
如果程序員忘記了原來add進來的類型,然後在get的時候,轉換成錯誤的實際類型了,就像下面這樣,會怎樣呢?
public class CatsAndDogs   
{  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args)   
    {  
        ArrayList cats = new ArrayList();  
        for(int i = 0; i < 7; i++)  
        {  
            cats.add(new Cat(i));  
        }  
          
        cats.add(new Dog(7));  
          
        for(int i = 0; i < 7; i++)  
        {  
            ((Cat)cats.get(i)).print();  
        }  
          
        for(int i = 0; i < cats.size(); i++)  
        {  
            ((Cat)cats.get(i)).print();  
        }  
        //dog is detected at run time  
  
    }  
  
}  
答案是編譯沒有問題,運行時纔會報錯。這樣就會有很大的風險。

所以需要對ArrayList進行封裝

public class AutoArrayList extends ArrayList{
     private Class itemClass;
     public AutoArrayList(Class itemClass){
         this.itemClass = itemClass;
     }

    public Object get(int index){
       try{
             while(index>=size()){
             add(itemClass.newInstance());
             }
         }catch(Exception e){
             e.printStackTrace();   
        }
        return super.get(index);
    }
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章