簡體   English   中英

在類上使用接口

[英]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接口。 因此,您可以具有多態的優勢,而無需進行類型轉換。

如果要使用諸如higherEntrylowerEntrylastEntry ,則只需使用NavigableMap接口而不是Map接口或TreeMap類。

通常,請盡可能多地使用界面,並使用可以支持您要使用的所有操作的最通用的界面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM