2010-09-30 107 views
2

我相信最好是編寫接口而不是實現。在Java:接口代碼而不是實現?

List<User> users = new ArrayList<User>(); 

沒有必要對所有在程序指定的users運行時類型如果代碼只關心它實現List

不過,我遇到很多人誰相信這是完全罰款,即使他們不使用特定於ArrayList的屬性:

ArrayList<User> users = new ArrayList<User>(); 

我試圖解釋它的冗餘,使得程序更難改變,但他們似乎並不在乎。還有其他原因,這很重要嗎?或者我的信念被誇大了?

回答

2

就我個人而言,我認爲這個論點有兩個部分。

  1. 如果您從類中的方法返回對象,它應該返回可能的最通用對象。在這種情況下,如果您有返回ArrayList<User>List<User>的選擇,請返回List<User>,因爲它可以讓您的班級消費者更輕鬆。

  2. 如果你在一個方法的內部編碼,並且你不介意硬編碼一個具體類型,那就去做吧。這不是我會做的,它會讓你的代碼在未來變得更加脆弱,但由於沒有外部依賴關係(因此是第一部分),所以你不會打破使用代碼的任何人。

+0

不錯的指導方針,並描述你可以在哪裏放鬆規則和權衡。 – hvgotcodes 2010-09-30 16:51:04

2

可測性是原因之一。如果您使用實現來實現,那麼很難剔除所需的對象並在測試中使用它。你通常最終會延長實施和重寫這是痛苦的。

+0

我在回答中忘記了可測試性。捂臉 – hvgotcodes 2010-09-30 16:50:29

0

如果你想使用依賴注入,這是非常重要的。對於hibernate也很重要 - 如果你有一個集合類型,你必須指定一個接口,因爲hibernate提供了它自己的集合實現。

這就是說,你不需要對此迂腐 - 有時並不重要。有時候你想指定具體類型來獲取只有該類型的方法。