160 votes

Générateur d’égal à égal/hashCode Apache Commons

Je suis curieux de savoir, ce que les gens ici pensent sur l’utilisation de `` / pour la mise en œuvre de la / ? Ne serait-il pas préférable que l’écriture de vos propres ? Il joue bien avec Hibernate ? Quelle est votre opinion ?

216voto

Sean Patrick Floyd Points 109428

Les communes/lang constructeurs sont grands et j'ai été de les utiliser pendant des années sans notable des performances (avec et sans la mise en veille). Mais comme Alain l'a écrit, la Goyave moyen est encore plus agréable:

Voici un exemple de Bean:

public class Bean{

    private String name;
    private int length;
    private List<Bean> children;

}

Voici equals() et hashCode (), mis en œuvre avec les Communes/Lang:

@Override
public int hashCode(){
    return new HashCodeBuilder()
        .append(name)
        .append(length)
        .append(children)
        .toHashCode();
}

@Override
public boolean equals(final Object obj){
    if(obj instanceof Bean){
        final Bean other = (Bean) obj;
        return new EqualsBuilder()
            .append(name, other.name)
            .append(length, other.length)
            .append(children, other.children)
            .isEquals();
    } else{
        return false;
    }
}

et ici avec la Goyave:

@Override
public int hashCode(){
    return Objects.hashCode(name, length, children);
}

@Override
public boolean equals(final Object obj){
    if(obj instanceof Bean){
        final Bean other = (Bean) obj;
        return Objects.equal(name, other.name)
            && length == other.length // special handling for primitives
            && Objects.equal(children, other.children);
    } else{
        return false;
    }
}

Comme vous pouvez le voir la Goyave version est plus courte, et évite le superflu des objets d'aide. En cas d'égalité, il permet même de court-circuiter l'évaluation si une Object.equal() appel renvoie la valeur false (pour être juste: communes / lang a un ObjectUtils.equals(obj1, obj2) méthode avec la même sémantique qui pourrait être utilisé à la place de EqualsBuilder pour permettre de court-circuit comme ci-dessus).

Donc: oui, les communes lang constructeurs sont très préférable à d'construits manuellement equals() et hashCode() méthodes (ou les affreux monstres Eclipse va générer pour vous), mais la Goyave, les versions sont encore mieux.

Et une note à propos de la mise en veille prolongée:

être prudent quant à l'utilisation paresseux collections dans votre equals(), hashCode() et toString() des implémentations. Qui échouera lamentablement si vous n'avez pas ouvert de Session.


Note (sur equals()):

a) dans les deux versions de equals() ci-dessus, vous pouvez utiliser l'une ou l'autre de ces raccourcis aussi:

@Override
public boolean equals(final Object obj){
    if(obj == this) return true;  // test for reference equality
    if(obj == null) return false; // test for null
    // continue as above

b) en fonction de votre interprétation de the equals() de contrat, vous pouvez également modifier la / les ligne(s)

    if(obj instanceof Bean){

pour

    // make sure you run a null check before this
    if(obj.getClass() == getClass()){ 

Si vous utilisez la deuxième version, vous avez probablement vous aussi voulez l'appeler super(equals()) à l'intérieur de votre equals() méthode. Les Opinions diffèrent ici, le sujet est abordé dans cette question:

droit moyen d'intégrer la super-classe dans une Goyave Objets.hashcode() de la mise en œuvre?

(même si c'est à propos de hashCode(), la même chose s'applique equals())


Note (inspiré par le Commentaire de kayahr)

Objects.hashCode(..) (tout comme le sous-jacent Arrays.hashCode(...)) pourrait mal fonctionner si vous avez de nombreux champs primitifs. Dans de tels cas, EqualsBuilder peut effectivement être la meilleure solution.

8voto

FrVaBe Points 14559

Si vous ne voulez pas dépendre d’une bibliothèque de parti 3e (peut-être que vous exécutez un un appareil disposant de ressources limitées) et vous ne voulez même pas à taper vos propres méthodes, vous pouvez également laisser l’IDE de faire le travail, par exemple dans l’utilisation d’eclipse

Vous obtiendrez un code « indigène » que vous pouvez configurer comme vous aimez et qui vous devez appuyer sur les modifications.


Exemple (Juno eclipse) :

}

7voto

Thomas Jung Points 17692

Le EqualsBuilder et HashCodeBuilder ont deux aspects principaux qui sont différentes de manuellement le code écrit:

  • la gestion des valeurs null
  • création de l'instance

Le EqualsBuilder et HashCodeBuilder faciliter la comparaison des champs qui pourraient être null. Avec manuellement écrit ce code crée beaucoup de passe-partout.

Le EqualsBuilder permettra d'autre part de créer une instance de p est égale à l'appel de la méthode. Si vos égaux méthodes sont appel souvent cela va créer un grand nombre de cas.

Pour la mise en veille prolongée l'equals et hashCode de la mise en œuvre ne font aucune différence. Ils sont juste un détail d'implémentation. Pour presque tous les objets du domaine chargé avec mise en veille prolongée, la gestion d'exécution (même sans échapper à l'analyse), le Constructeur peut être ignoré. Base de données et de communication, les frais généraux seront importants.

Comme skaffman mentionné le reflet version ne peut pas être utilisée dans le code de production. La réflexion sera de ralentir et de la "mise en œuvre" ne sera pas correcte pour tous, mais le plus simple des classes. Prenant tous les membres en compte, c'est aussi dangereux que le nouvellement introduit les membres de changement de la méthode equals de comportement. La réflexion peut être utile dans le code de test.

4voto

Alain Pannetier Points 4488

Si vous n’avez pas à écrire vos propres, il y a aussi la possibilité d’utiliser google goyave (anciennement les collections de google)

0voto

DEREK LEE Points 83

Si vous traitez juste avec l’haricot d’entité où id est une clé primaire, vous pouvez simplifier.

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