[英]Using interfaces over classes
我對將Java類使用接口的建議感到困惑,就像在該線程中一樣: 為什么應該首選Java類的接口?
我了解您為什么要使用該接口:如果以后有更改,您需要清理的代碼就會更少。
但是,在某些情況下,使用接口會不會妨礙您利用性能原因來選擇特定類呢?
例如,如果我有一個TreeMap,我假設我應該最多可以找到O(logn)中的任何元素。 這就是為什么它具有不錯的方法,我可以利用它們的優點,例如HigherEntry(),lowerEntry(),lastEntry()。
如果我改為將此TreeMap稱為Map,則現在我被迫一次遍歷O(n)中的列表來迭代一個元素以找到該條目。
我是Java的新手,所以如果我在這里缺少東西,請告訴我。
如果我改為將此TreeMap稱為Map,則現在我被迫一次遍歷O(n)中的列表來迭代一個元素以找到該條目。
不,您沒有被迫這樣做。 如果您確定自己的Map
引用持有對TreeMap
的引用,並且您想訪問TreeMap
特定方法,則可以始終將Map
引用類型轉換為TreeMap
引用,然后訪問適當的方法,例如higherEntry()
, lowerEntry()
。 但是,唯一的警告是,您必須確保Map
引用實際上指向TreeMap
,以避免在運行時獲取ClassCastException
。
這是由以下事實暗示的: super class
及其sub classes
本質上是協變的。 因此,只要您在運行時不違反規則,就可以在它們之間執行強制轉換(即,使super class
引用保存對其他sub class
實例的引用,該實例與要投射到的sub class
沒有協變)。
現在以您的示例為例,由於TreeMap
還實現了NavigableMap
接口,它是Map
接口的子接口,因此您可以使用它代替Map
接口。 因此,您可以具有多態的優勢,而無需進行類型轉換。
如果要使用諸如higherEntry
, lowerEntry
和lastEntry
,則只需使用NavigableMap
接口而不是Map
接口或TreeMap
類。
通常,請盡可能多地使用界面,並使用可以支持您要使用的所有操作的最通用的界面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.