2012-08-11 38 views
1

例如,我經常看到這樣的:我什麼時候想要通過實際的類聲明接口?

Set<Integer> s = new TreeSet<Integer>(); 
Set<Integer> s = new HashSet<Integer>(); 
Map<Integer, String> m = new HashMap<Integer, String>(); 

TreeSet<Integer> ts = new TreeSet<Integer>(); 
HashSet<Integer> hs = new HashSet<Integer>(); 
HashMap<Integer, String> hm = new HashMap<Integer, String>(); 

有什麼優勢/前者VS後者的短處?

+0

http://stackoverflow.com/questions/2026054/why-do-we-use-interface-is-it-only-for-standardization – Jayan 2012-08-11 03:12:00

+1

其實,這是更相似:http://stackoverflow.com/questions/1484445/why-are-variables-declared-their-interface-name-in-java?rq = 1 – Zong 2012-08-11 03:13:22

+0

@Zong Li:是的,其實這個是重複的。 – Jayan 2012-08-11 04:08:21

回答

2

對我來說它歸結爲一個點數。

你關心的執行?您的代碼是否需要知道MapHashMapTreeMap?或者它只是在乎它是否有某種鍵/值結構

這也意味着當我構建我的實現代碼時,如果我公開一個返回Map的方法,我可以隨時改變實現影響依賴於它的任何代碼(因此,嘗試投射這些類型的值是一個糟糕的主意)

另一種情況是,圍繞代碼移動這些結構變得更加容易,因此任何方法都可以接受一個Map會更容易處理,然後依賴於一個HashMap例如

約定(我遵循)基本上是t o使用滿足API要求的最低功能接口。使用一個接口,並沒有提供的功能的API需要(例如,如果你需要一個SortedMap,沒點用Map然後)

恕我直言

1

一般不點,你要聲明的最普遍的類型它具有您實際使用的行爲。這樣,如果您決定採用不同的具體課程,則不必更改太多的代碼。而且你讓這個功能的用戶更加自由。

1

您應該閱讀On Understanding Data Abstraction, RevisitedWilliam R. Cook以及他的Proposal for Simplified, Modern Definitions of "Object" and "Object Oriented"。基礎知識:如果您使用Java類作爲工廠以外的任何其他工具,即如果您在new運算符之後有任何期望的類名,那麼您不會執行面向對象的編程。遵守這條規則並不能保證你在做OO,但違反這條規則意味着你不是。

注:也沒什麼不好不這麼做OO。

0

應用程序的維護可以成本的三倍之多發展。這意味着您希望代碼儘可能簡單明瞭。

如果你使用一個列表,而不是一個ArrayList的,你說清楚,你沒有使用特別的一個ArrayList的任何方法,它可以從另一個List實現改變。使用ArrayList的問題並不一定是需要很長時間才能確定它確實可能是List。即很難證明你從不需要什麼東西。 (這是比較容易添加的東西比刪除)

一個類似的例子是使用Vector當列表就行了。如果你看到一個你說的向量;開發人員選擇了一個Vector有一個很好的理由,它是線程安全的。但我現在需要改變它並檢查代碼是否是線程安全的。他們你說,但我不明白它是如何以多線程方式使用的,所以我必須檢查它可能被使用的所有方式,或者當我迭代它時需要添加同步,而實際上它從不需要線程安全。在不需要時使用線程安全收集不僅僅是浪費CPU時間,更重要的是浪費開發人員的時間。

相關問題