2012-05-13 81 views

回答

2

一個specfic類型的對象編寫只接受允許的包裝功能鍵入並隱藏集合。這是Java-5之前的標準最佳實踐。

private final List strings = new ArrayList(); 

public void add(String s) 
{ 
    strings.add(s); 
} 

public String remove(String s) 
{ 
    return (String) strings.remove(s); 
} 

// etc... 

是的,這很糟糕。

我可以問一下:有沒有你不使用泛型的原因?他們字節碼與Java 1.4兼容

+0

該應用程序是一個非常古老的遺留系統,所以不知道它是否用java寫的1.4 – Pragya

1

兩個選項,(我假設C#在這裏,但都適用於幾乎所有的OO語言)。

1)從集合類型的選擇(或它的接口繼承),重寫所有的方法來扔在錯誤的異常類型,像這樣:


public class MyType 
{ 
    // Your type here 
} 

public class MyTypeCollection : ArrayList 
{ 
    public override int Add(object value) 
    { 
     if (!(value is MyType)) 
     { 
      throw new ArgumentException("value must be of type MyType"); 
     } 

     return base.Add(value); 
    } 

    public int Add(MyType myType) 
    { 
     return base.Add(myType); 
    } 

    // Other overrides here 
} 

或 2)(可能更好),創建自己的類型,並實現接口作爲集合所需的接口,並在內部使用非通用的非類型集合。類似這樣的:



public class MyTypeCollection2 : IEnumerable 
{ 
    private readonly ArrayList _myList = new ArrayList(); 

    public void Add(MyType myType) 
    { 
     _myList.Add(myType); 
    } 

    // Other collection methods 

    public IEnumerator GetEnumerator() 
    { 
     yield return _myList.Cast<MyType>(); 
    } 
} 

確保實現您將關心的所有接口。在.NET框架中爲ArrayList實現的接口是:IList,ICloneable

希望這有助於。