Editor modelli per la programmazione difensiva
-
22-08-2019 - |
Domanda
Recentemente ho lavorato FindBugs avvisi di esporre stato interno, cioè quando un riferimento ad un array è stato restituito invece di restituire una copia della matrice. Ho creato alcuni modelli per fare la conversione di quel codice più facile.
Quale hai creato per supportare la programmazione difensiva e desidera condividere con la folla SO?
Modelli realizzati da me finora (a titolo di esempio):
Per creare una copia di un array di ritorno da un metodo:
final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );
Per clonare un oggetto:
(${o}!= null?(${type})${o}.clone():null)
Soluzione
Mi piace avere come modello una definizione "più sicuro" equals ():
/**
* 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;
}
Per essere sicuri di evitare sempre Eq: uguale metodo override pari a superclasse e non possono essere simmetrica (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC
), dove:
Questa classe definisce un metodo che ignora un metodo equals in una superclasse uguale. Sia uguale metodi metodi utilizzano instanceof nel determinare se due oggetti sono uguali.
Questo è pieno di pericoli, in quanto è importante che il metodo equals è simmetrico (in altre parole,
a.equals(b) == b.equals(a)
).
SeB
è un sottotipo diA
eA
di uguale controlli metodo che l'argomento è uninstanceof A
e B di uguale metodo di verifica che l'argomento è uninstanceof B
, è molto probabile che la relazione di equivalenza definita da questi metodi non è simmetrica.
Questo è solo per le classi di attuazione Comparable
e consente:
- un'implementazione di uguali, che è sempre la stessa;
- tutte le logiche di confronto per essere collocata in un posto solo (la funzione
compareTo()
); - il rispetto del javadoc di
Comparable#compareTo()
chiede di garantire che(x.compareTo(y)==0) == (x.equals(y))
(fortemente raccomandato, ma non strettamente necessario però).
Altri suggerimenti
Non è un modello, ma io uso array.clone()
invece di System.arraycopy()
. C'è qualcosa di sbagliato in questo?
Modifica: Un modello che uso quando l'attuazione di un decoratore, soprattutto per un'interfaccia con molti metodi:
wrapped.${enclosing_method}(${enclosing_method_arguments})
Genera un'implementazione del metodo attuale delegando la chiamata a un esempio avvolto, evitando così gli errori di copia / incolla.