[英]Why do some people use the List base class to instantiate a new ArrayList?
我不斷遇到代碼,人們實例化一個新的ArrayList並將其分配給List接口,如下所示:
List<String> names = new ArrayList<String>();
這種方法背后的原因是什么?
將代碼與接口的特定實現分離。
這也有助於您將來轉移到List
接口的另一個實現。
例如 -
你有List<String> names = new ArrayList<String>();
稍后你決定你應該使用List
接口的其他一些實現,比如LinkedList
所以你只需將它改為List<String> names = new LinkedList<String>();
什么都沒有打破
這樣的代碼不使用 List
類,它將變量聲明為List
類型。 這稱為抽象
List
是一個接口 ,它定義了實際類具有的方法,而不指定使用哪個實際類。
雖然這里沒什么大不了的,但這種做法非常重要,甚至在更復雜的情況下也很重要。 始終遵循這種模式是一種很好的做法。
編程到接口,而不是實現
這是Gang of Four(GoF)的設計模式 。 這是為什么?
您可以通過抽象合同而不是具體實施來指導。
public class MyClass {
private List myList ;
public setMyList(List list){
myList=list;
}
}
而不是ArrayList
實現你想要LinkedList
實現? 這樣你只需要用setter注入該屬性。
抽象是關鍵,你對實現只有規范的指導一無所知。
閱讀本文對界面編程意味着什么?
List<String> names = new ArrayList<String>();
通過這種方式,您可以針對接口List
編寫代碼,這樣,如果必須,可以在將來輕松切換實現。
在這種情況下,以下就足夠了 -
List<String> names = new //some other implementation of List
現在,如果你做如下的事情 -
ArrayList<String> names = new ArrayList<String>();
您將針對實現ArrayList
本身進行編碼。 並且您的代碼與特定實現相關聯。 如果你必須切換實現,那么它將需要大量的代碼更改。
檢查文檔以發現Java 6提供的一些標准實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.