![](/img/trans.png)
[英]IntelliJ: search and replace 'var' declarations with actual types
[英]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
是您的正確抽象,而不是List
或Set
,那么請使用它。 如果您需要使用某些東西作為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.