2013-05-03 198 views
0
List<Kevin> kevin = new ArrayList<Kevin>(); 

我有一個凱文類型的對象列表,現在它對我傳遞給我的方法有什麼影響嗎?傳遞對象列表或ArrayList對象

void method1(List<Kevin>) 

void method2(ArrayList<Kevin>) 

似乎都在工作,沒有任何差別除了從我不得不List interface related methods對方法1和array list related methods on method2.訪問,我只是不知道我們是否需要發送List或對象的ArrayList

+0

列表接口方法將在這兩種情況下可用 – hop 2013-05-03 19:40:23

回答

3

他們都會表現相同的方式。通常最好在可能的情況下對接口進行編碼,因此更喜歡List<Kevin>(或者如果您只需要遍歷集合,則甚至可以使用Iterable<Kevin>)。如果你的方法只有在ArrayList<Kevin>的情況下才能正常工作,這已經足夠了......但除此之外,最好不要限制呼叫者強制他們通過ArrayList

+0

謝謝約翰。我只是對Iterable 感到困惑,讓我把我的kevin對象列表傳遞給method1,接收者可以是列表或ArrayList或Iterable類型的kevin?... – Kevin 2013-05-03 19:45:50

+0

@Kevin:其中任何一個。但是否可以使用'Iterable '將取決於您想要在該方法中執行的操作。例如,你不能*添加*到'Iterable'。 – 2013-05-03 19:47:27

2

method1對於List的其他實現(例如LinkedList)也可以正常工作,而method2更嚴格並且只接受一個實現。一般來說,爲了可重用性的原因,儘可能地儘可能地使你的方法參數。

2

在大多數情況下,它並不重要。一個ArrayList是一個List所以你從List得到的任何功能,你也可以從ArrayList得到。我應該注意,由同一個校長,你實際上可能不會得到一個ArrayList,而是從ArrayList繼承的一些子類(就像如果你說List)。

也就是說,通常認爲最佳做法是要求最需要的一般類型。因此,如果您只需要List提供的方法,則可以傳遞List對象,但是,如果您需要某種特定於ArrayList的內容,請傳遞該對象。

1

傳遞一個ArrayList會阻止你(或者至少使其更困難)改變你的想法和使用的List另一種後來,因爲method2()將依靠在名單上ArrayList型的,而不是簡單地List

在其他List實現,你可以想傳遞是LinkedListCopyOnWriteArrayListArrays.asList()Collections.synchronizedList(),或者,通常Collections.unmodifiableList()

最好的做法是這樣對接口進行編程,並通過一個List(甚至CollectionIterable如果調用方法甚至不應該承擔這是一個列表)。

對於同一個類中的私有方法,它並不重要。但是如果該方法是公共API的一部分,那麼傳遞一個ArrayList可能會在某個時候傷害你。