2010-09-07 4 views
9

Il existe un objet Java bean qui a implémenté la fonction equals en fonction de certains critères (Critère A). J'ai besoin d'identifier des objets uniques en fonction d'un autre critère (Critère B). Puisque la fonction equals utilise le critère A, je ne peux pas utiliser HashSet. Donc j'ai pensé à utiliser TreeSet avec mon Comparator personnalisé qui est basé sur le critère B. Ma question est, Est-il permis de faire comme ça? Des problèmes avec cette approche?Fonction TreeSet et égal à

Merci.

Répondre

14

Voici quelques indications d'Oracle Java:

Notez que l'ordre maintenu par un ensemble (ou non un comparateur explicite est fourni) doit être compatible avec égaux si elle est de correctement implémenter l'interface Set. (Voir Comparable ou Comparator pour une définition précise compatible avec égaux.) Il en est ainsi parce que l'ensemble d'interface est définie en termes de égale opération, mais une TreeSet instance effectue toutes les comparaisons clés en utilisant son compareTo (ou comparer) méthode, donc deux clés qui sont réputés égales par cette méthode sont, du point de vue de l'ensemble, égal. Le comportement d'un ensemble est bien défini même si son ordre est incompatible avec est égal à; il échoue simplement à obéir au contrat général de l'interface Set.

Je pense qu'en termes de technique, non, vous n'avez aucun problème. Mais, en termes de codage, de lisibilité et de maintenabilité, vous devez faire attention, car d'autres personnes peuvent mal utiliser ou mal comprendre ce que vous faites

1

Si vous effectuez une recherche souvent et ajoutez rarement des éléments, pensez à les conserver dans un List trié par Critère B et utilisant Collections.binarySearch.

1

Vous pouvez les envelopper:

class BeanWrapper { 

... 

public boolean equals(Object other) { 
    return myBean.critB.equals(((Bean)other).critB); 
} 

} 

et les mettre dans le jeu comme ça.

Questions connexes