modèles de l'éditeur pour la programmation défensive
-
22-08-2019 - |
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)
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)
).
SiB
est un sous-type deA
et deA
est égal méthode vérifie que l'argument est uninstanceof A
et B est égal à la méthode vérifie que l'argument est uninstanceof 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.