簡體   English   中英

Java良好實踐 - 接口類型的聲明,而不是實現類型的聲明

[英]Java good practice - Declarations of interface types instead of declarations of implementation types

在“O'Reilly - Programming Android”中,他們建議避免使用此代碼:

ArrayList<String> a = new ArrayList<String>();

但要用這個替換它:

List<String> a = new ArrayList<String>();

他們認為,如果稍后應該更改a的類型來表示鏈接列表,則維護代碼會更容易。 如果是這樣,為什么不使用Collection類型,甚至是Object

我覺得必須更改實例化以更改其類型,當然最好盡可能地保持類型限制並在需要時更改額外的行。

他們是對的嗎?

他們是對的。

您應該盡可能使用最受限制的類型。 如果Collection是您的正確抽象,而不是ListSet ,那么請使用它。 如果您需要使用某些東西作為Object ,那么無論如何,請將其稱為Object 但如果你需要更具體,那就更具體一點。 訣竅是在沒有必要時避免施法。

正如您所提到的,我們的想法是在您不希望公開它們時隱藏實現細節。 這使您的軟件更易於使用且更易於維護。 例如,如果您有一個返回List的方法,那么使用您的軟件的人不必擔心它實際上是List實現。 這有助於使您的軟件更易於理解。 現在,正因為如此,您可以隨意更改哪種類型的List (大多數情況下)會損壞調用該方法的程序。

他們錯了。

如果類型出現在公共API中,它應該與語義允許的一樣。

List<String> getStringList();

作為實現細節,類型應該與程序員知道的一樣具體。

ArrayList<String> stringList = new ArrayList<>();

因為您無法對Object引用執行任何有用的操作。

在我個人看來,您應該使用盡可能高的接口(在層次結構中)並具有您需要的操作。

在某些情況下,您只需要存儲對象,迭代並使用索引獲取它們。 List界面提供了這一點。 對象不提供這些方法。

使用Object - 您將使代碼的可讀性降低,並且可能會出現強制轉換異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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