簡體   English   中英

為什么有些人使用List基類來實例化一個新的ArrayList?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM