2013-10-20 48 views
0

有效的java鼓勵使用接口而不是抽象/具體類。 問題是如果有一個接口heirachy,應該選擇哪種接口類型,爲什麼?哪個界面更喜歡哪個界面?

例如,ArrayList實現List,其實現Collection,其實現Iterable。 那麼我們什麼時候通過list vs collection vs iterable

顯而易見的答案是,每個子類不斷增加更多的功能。那麼,我們應該繼續爬上層次結構,直到所需的功能匹配? 我的意思是,如果在虛構應用中只需要iterator()然後使用Iterable否則使用List

+0

如果API – MadProgrammer

+0

的偏好將滿足需求,但如果超過兩個滿足,那麼我們採取層次最高的一個嗎? – JavaDeveloper

+1

我會採取最清楚解釋你想要做的事情。這可能是最高的,但有時這對於您的目的而言過於通用。例如,經常用'Set'替換'Collection',因爲它們有相同的方法,但只有'Set'表示你期望元素是唯一的。 –

回答

3

總是使用最抽象的界面來滿足您的需求。

在Iterable,Collection,List的例子中,如果你只需要迭代,那麼只能遍歷Iterable。如果您只需要Collection提供的方法,那麼只能傳遞一個集合。

之所以這樣,是因爲您可以在以後輕鬆更換。例如,如果您有一個函數只需要一個Iterable,但將List作爲函數參數,那麼稍後如果您決定將數據存儲爲HashSet更有意義,則必須更改很多代碼來使其工作。但是,由於HashSet是Iterable,如果您剛剛通過Iterable到您的函數,您將不得不改變更少的代碼。

這也使得在某些情況下測試更容易。例如,想象一下你有一些擴展接口Bar的接口Foo。如果你有一個函數需要一個Foo參數,那麼你必須模擬Bar期望的所有東西,並且你必須模擬Foo添加到其中的所有東西。如果你的函數只需要一個Bar參數,那麼你只需要模擬Bar。

0

從他的評論中可以明顯看出,OP一直希望得到「最抽象的」,通常我會同意的。

但是,在我的實際經驗中,size()真的很有用。 (笑話省略)。隨着代碼的發展,它們通常會變得更有用。因此,爲了提前計劃,我的建議(在這個具體的例子中)是使用Iterable上的Collection。

相關問題