Editor Vorlagen für defensive Programmierung
-
22-08-2019 - |
Frage
Kürzlich habe ich an FindBugs Warnungen über einen internen Zustand ausgesetzt wird, das heißt, wenn eine Referenz auf ein Array zurückgegeben wurde stattdessen eine Kopie des Arrays von zurückkehrt. Ich habe einige Vorlagen konvertieren diesen Code leichter zu machen.
Welches haben Sie erstellen defensive Programmierung zu unterstützen und wollen mit dem SO Publikum teilen?
Vorlagen Ich habe bisher erstellt hat (siehe Beispiele):
Um eine Kopie eines Arrays zu erstellen, die von einer Methode zurückgeben:
final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );
Um ein Objekt zu klonen:
(${o}!= null?(${type})${o}.clone():null)
Lösung
Ich mag es, als Vorlage eine "sichere" equals () Definition:
/**
* 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;
}
Um sicher zu sein, immer zu vermeiden Gleichung: gleich überschreibt Methode in übergeordnete Klasse gleich und kann nicht symmetrisch sein (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC
), wobei gilt:
Diese Klasse definiert ein Gleichheitsverfahren, das eine Gleichheits Methode in einer Superklasse überschreibt. Beide gleich Methoden Methoden Instanceof bei der Bestimmung, ob zwei Objekte gleich sind.
Dies ist voller Gefahren, da es wichtig ist, dass die Methode equals symmetrisch ist (mit anderen Worten,
a.equals(b) == b.equals(a)
).
WennB
ein Subtyp vonA
ist, undA
die gleich prüfen Verfahren, dass das Argument eininstanceof A
ist, und B gleich Methode überprüft, ob das Argument eineinstanceof B
, ist es durchaus wahrscheinlich, dass die Äquivalenzbeziehung mit diesen Methoden definierte nicht symmetrisch ist.
Dies ist nur für die Klassen Umsetzung Comparable
und ermöglicht:
- eine Implementierung von Gleichen, die immer das gleiche ist;
- alle Vergleichslogiken in einem Ort nur angeordnet werden (die
compareTo()
Funktion); - die Einhaltung der javadoc von
Comparable#compareTo()
fordert, dass(x.compareTo(y)==0) == (x.equals(y))
, um sicherzustellen, (dringend empfohlen, aber nicht unbedingt erforderlich, obwohl).
Andere Tipps
Nicht eine Vorlage, aber ich benutze array.clone()
statt System.arraycopy()
. Gibt es etwas falsch?
Edit: Eine Vorlage ich benutze, wenn ein Dekorateur Umsetzung, insbesondere für eine Schnittstelle mit vielen Methoden:
wrapped.${enclosing_method}(${enclosing_method_arguments})
Es erzeugt eine Implementierung der aktuellen Methode durch den Anruf an eine umhüllte Instanz zu delegieren, so copy / paste Fehler zu verhindern.