Maison > Java > javaDidacticiel > Quelle est la principale différence entre `HashMap map = new HashMap();` et `Map map = new HashMap();` en Java ?

Quelle est la principale différence entre `HashMap map = new HashMap();` et `Map map = new HashMap();` en Java ?

Susan Sarandon
Libérer: 2024-11-27 14:00:14
original
698 Les gens l'ont consulté

What is the key difference between `HashMap map = new HashMap();` and `Map map = new HashMap();` in Java?

Distinction entre HashMap et Map en Java

Lors de la définition de cartes en Java, les utilisateurs peuvent rencontrer des variations telles que :

HashMap<String, Object> map = new HashMap<String, Object>();
Map<String, Object> map = new HashMap<String, Object>();
Copier après la connexion

Sous-jacent Object

Malgré ces différences, les deux déclarations de map aboutissent au même objet sous-jacent : un HashMap. La distinction réside dans l'interface par laquelle on accède à l'objet.

Différence d'interface

Dans le premier cas, le type d'interface est HashMap, fournissant accès direct aux méthodes spécifiques à HashMap. Dans le deuxième cas, le type d'interface est Map, offrant une interface plus générique au HashMap sous-jacent.

Codage vers les interfaces

Généralement, il Il est recommandé de coder sur l'interface la plus abstraite (Map ici) plutôt que sur une implémentation spécifique (HashMap). Cela permet une certaine flexibilité dans la modification de l'implémentation sous-jacente sans casser le code existant.

Exemple de rupture de contrat

Considérons une classe Foo avec deux HashMaps :

class Foo {
    private HashMap<String, Object> things;
    private HashMap<String, Object> moreThings;

    // Getters and methods using HashMaps
}
Copier après la connexion

Une sous-classe SpecialFoo utilise des choses et plus de choses via des méthodes qui attendent HashMaps :

class SpecialFoo extends Foo {
    // Methods using HashMaps
}
Copier après la connexion

Si Foo est mis à jour ultérieurement pour utiliser TreeMaps au lieu de HashMaps, la signature de type des choses et plus change. En conséquence, SpecialFoo tombe en panne car il attend des HashMaps mais reçoit maintenant des TreeMaps.

Solution : Déclarer les collections comme interfaces

Pour éviter de telles ruptures de contrat, déclarez les collections comme l'interface la plus abstraite possible :

class Foo {
    private Map<String, Object> things;
    private Map<String, Object> moreThings;

    // Getters and methods using Maps
}
Copier après la connexion

Cette approche garantit que SpecialFoo ne se brisera pas si Foo's changements de mise en œuvre.

Avantages du codage pour les interfaces

  • Flexibilité et maintenabilité accrues
  • Risque réduit de rupture de contrat
  • Adhésion aux principes de conception de logiciels (par exemple, encapsulation, dépendance) inversion)

Par conséquent, même si les deux déclarations de carte peuvent sembler différentes, elles aboutissent au même objet sous-jacent. Les meilleures pratiques imposent de coder sur l'interface la plus abstraite pour préserver la flexibilité et éviter les ruptures de code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal