4 votes

Etendre HashMap et LinkedHashMap en même temps ?

Je veux étendre HashMap pour ajouter la méthode putIfGreaterThan qui récupère essentiellement la valeur pour une clé donnée et si la nouvelle valeur est supérieure à l'ancienne valeur, nous mettons à jour l'ancienne valeur avec la nouvelle valeur. Comme ceci:

public void putIfGreaterThan(String key, Double value)
{

if (containsKey(key) != true) {
put(key, value);
} else {
if (get(key) < value) {
System.out.println("Ajout de la nouvelle valeur: " + value + " à la carte");
put(key, value);
} else {
System.out.println("N'a pas ajouté de valeur: " + value + " à la carte");
}
}

}

Le programme ci-dessus fonctionne bien - cependant je voudrais ajouter cette méthode à la fois HashMap et LinkedHashMap. En d'autres termes, si quelqu'un instancie:

HashMap hashmap = new HashMap();

Ils devraient pouvoir accéder à la méthode:

hashmap.putIfGreaterThan();

Et si quelqu'un instancie:

LinkedHashMap linkedhashmap = new LinkedHashMap();

Ils devraient pouvoir accéder à la méthode:

linkedhashmap.putIfGreaterThan();

Si je crée une nouvelle classe comme suit:

MyHashMap étend HashMap et ajoute la méthode précédemment mentionnée - je n'étends que HashMap pas LinkedHashMap. Cela ne me permettrait pas d'accéder à la méthode si j'instancie un LinkedHashMap.

Je pensais modifier le code source dans la classe HashMap d'origine (en ajoutant la méthode putIfGreaterThan) cependant je ne suis pas en mesure de modifier le code source à moins de décompiler toute la classe (et quand j'essaie de le faire j'obtiens plein d'autres erreurs donc j'ai pensé que ce serait plus facile juste d'étendre la classe HashMap mais en faisant cela je ne peux pas utiliser la méthode putIfGreaterThan sur à la fois HashMap et LinkedHashMap).

De plus, si j'avais ajouté la méthode à la classe d'origine, on pourrait appeler cette méthode sur n'importe quel HashMap (même si la carte contient deux chaînes) mais la méthode est applicable uniquement à un HashMap contenant String et Double ou String et Int. Par conséquent, je pense qu'il est plus logique d'étendre la classe d'origine et de personnaliser la classe actuelle avec des méthodes liées à un HashMap de String et Double.

Des suggestions?

Merci

2voto

Calculator Points 2537

Laissez votre carte personnalisée implémenter l'interface Map à la place et envelopper une carte concrète avec celle-ci qui est fournie par l'utilisateur de la classe via le constructeur:

public class MyMap implements Map{
    private final Map map;  

    public MyMap(Map map){
        this.map = map;
    }

    public void putIfGreaterThan(String key, Double value ){...}

    @Override
    public int size() {
        return map.size();
    }

    //méthodes héritées
}

Cette classe peut être utilisée de cette façon:

MyMap map = new MyMap(new LinkedHashMap<>());

ou:

MyMap map = new MyMap(new HashMap<>());

0voto

Kefka Points 366

Java ne supporte pas l'héritage multiple, mais vous pouvez le faire en utilisant des interfaces.

Héritage Multiple en Java

0voto

user7 Points 8280

Vous ne pouvez pas ajouter votre méthode à la classe HashMap ou LinkedHashMap existante. La seule façon est de créer une classe personnalisée MyHashMap qui implémente l'interface Map et d'y mettre votre logique, puis de composer cette classe avec HashMap et/ou LinkedHashMap et de permettre à vos clients d'opérer sur MyHashMap.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X