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)
War es hilfreich?

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)).
  Wenn B ein Subtyp von A ist, und A die gleich prüfen Verfahren, dass das Argument ein instanceof A ist, und B gleich Methode überprüft, ob das Argument eine instanceof 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top