Java でマップを定義する場合、次のようなバリエーションに遭遇する可能性があります。
HashMap<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
基礎オブジェクト
これらの違いにもかかわらず、両方ともマップされます宣言では、同じ基底オブジェクト、HashMap
インターフェイスの違い
最初の例では、インターフェイス タイプは HashMap インターフェイスのコーディング 一般に、特定の実装 (HashMap) ではなく、最も抽象的なインターフェイス (ここではマップ) をコーディングすることをお勧めします。これにより、既存のコードを壊すことなく、基礎となる実装を柔軟に変更できるようになります。 コントラクト違反の例 2 つの HashMap を持つクラス Foo を考えてみましょう: サブクラス SpecialFoo は、期待されるメソッドを介して things や moreThings を使用します。 HashMaps: Foo が後で HashMap の代わりに TreeMap を使用するように更新された場合、things および moreThings の型シグネチャが変更されます。その結果、SpecialFoo は HashMaps を予期していましたが、現在は TreeMap を受信しているため壊れます。 解決策: コレクションをインターフェイスとして宣言する このような契約違反を防ぐには、コレクションを宣言します。可能な限り最も抽象的なインターフェイスとして: このアプローチにより、SpecialFoo はFoo の実装が変更されても壊れません。 インターフェイスにコーディングする利点 したがって、2 つのマップ宣言は異なっているように見えますが、結果的には同じ基礎となるオブジェクトになります。ベスト プラクティスでは、柔軟性を維持し、コードの破損を防ぐために、最も抽象的なインターフェイスにコーディングすることが求められます。class Foo {
private HashMap<String, Object> things;
private HashMap<String, Object> moreThings;
// Getters and methods using HashMaps
}
class SpecialFoo extends Foo {
// Methods using HashMaps
}
class Foo {
private Map<String, Object> things;
private Map<String, Object> moreThings;
// Getters and methods using Maps
}
以上がJava の「HashMap map = new HashMap();」と「Map map = new HashMap();」の主な違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。