在 Java 中定義 Map時,使用者可能會遇到以下變更:
HashMap<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
底層Object
儘管存在這些差異,但這兩個映射聲明的結果在同一個底層物件中:HashMap
介面差異
第一個實例中,介面類型是 HashMap
介面編碼
一般來說,它建議編寫最抽象的介面(此處為 Map)而不是具體的實作(HashMap)。這允許在不破壞現有程式碼的情況下靈活地更改底層實作。
合約破壞範例
考慮一個具有兩個HashMap 的Foo 類別:
class Foo { private HashMap<String, Object> things; private HashMap<String, Object> moreThings; // Getters and methods using HashMaps }
子類moreThings HashMaps:
class SpecialFoo extends Foo { // Methods using HashMaps }
如果Foo稍後更新為使用 TreeMaps 而不是 HashMaps,things 和 moreThings 的類型簽章會發生變化。結果,SpecialFoo 中斷,因為它期待 HashMap,但現在接收 TreeMap。
解決方案:將集合宣告為介面
為了防止此類違反合約的行為,請聲明集合作為最抽象的介面:
class Foo { private Map<String, Object> things; private Map<String, Object> moreThings; // Getters and methods using Maps }
這個方法確保SpecialFoo 不會在下列情況下中斷: Foo 的實作改變了。
介面編碼的好處
因此,雖然兩個映射聲明可能看起來不同,但它們會產生相同的底層物件。最佳實踐要求編碼為最抽象的接口,以保持靈活性並防止代碼損壞。
以上是Java 中 `HashMap map = new HashMap();` 和 `Map map = new HashMap();` 之間的主要差異是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!