Question

Récemment, je travaillais sur des avertissements FindBugs à exposer l'état interne, à savoir quand une référence à un tableau a été retourné au lieu de retourner une copie du tableau. J'ai créé quelques modèles pour faire la conversion de ce code plus facile.

Lequel avez-vous créé pour soutenir la programmation défensive et que vous voulez partager avec la foule SO?

Les modèles que j'ai créé jusqu'à présent (à titre d'exemple):

Pour créer une copie d'un tableau de revenir à partir d'un procédé:

final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );

Pour cloner un objet:

(${o}!= null?(${type})${o}.clone():null)
Était-ce utile?

La solution

J'aime avoir comme modèle un « plus sûr » est égal à () définition:

 /**
 * Implement equals based on ${cursor}. <br />
 * See {@link #compareTo(Object) compareTo}
 * @see java.lang.Object#equals(java.lang.Object)
 */
public boolean equals(final Object anObject)
{
    boolean res = false;
    if(anObject == null) { return false; }
    if(anObject == this) { return true; }
    if(anObject.getClass() == this.getClass())
    {
        res = this.compareTo(anObject) == 0;
    }
    return res;
}

Pour être sûr d'éviter toujours l'équation: la méthode est égale à overrides égale à superclasse et peuvent ne pas être symétrique (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC), où:

  

Cette classe définit une méthode equals qui remplace une méthode equals dans une superclasse. Les deux méthodes de méthodes équivaut à utiliser instanceof pour déterminer si deux objets sont égaux.

     

est semée d'embûches, car il est important que la méthode equals est symétrique (en d'autres termes, a.equals(b) == b.equals(a)).
  Si B est un sous-type de A et de A est égal méthode vérifie que l'argument est un instanceof A et B est égal à la méthode vérifie que l'argument est un instanceof B, il est fort probable que la relation d'équivalence définie par ces méthodes ne sont pas symétriques.


Ceci est seulement pour les classes de mise en œuvre Comparable et permet:

  • une mise en œuvre d'égal à égal qui est toujours le même;
  • toutes les logiques de comparaison pour être situés dans un seul endroit (la fonction de compareTo());
  • le respect de la javadoc de Comparable#compareTo() demandant de veiller à ce que (x.compareTo(y)==0) == (x.equals(y)) (fortement recommandé, mais pas strictement nécessaire cependant).

Autres conseils

Pas un modèle, mais je l'utilise array.clone() au lieu de System.arraycopy(). Y at-il de mal à cela?

Edit: Un modèle que j'utilise la mise en œuvre d'un décorateur, en particulier pour une interface avec de nombreuses méthodes:

wrapped.${enclosing_method}(${enclosing_method_arguments})

Il génère une mise en œuvre de la méthode actuelle en déléguant l'appel à une instance enveloppé, évitant ainsi les erreurs de copier / coller.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top