2008-12-17 11 views
8

Recentemente ho lavorato sugli avvisi di FindBugs sull'esposizione dello stato interno, vale a dire quando veniva restituito un riferimento a un array invece di restituire una copia dell'array. Ho creato alcuni modelli per rendere più semplice la conversione di quel codice.Modelli di editor per la programmazione difensiva

Quale è stato creato per supportare la programmazione difensiva e desidera condividere con la folla SO?

modelli che ho creato finora (a titolo di esempio):

Per creare una copia di un array di ritorno da un metodo:

Per clonare un oggetto:

(${o}!= null?(${type})${o}.clone():null) 
Non

risposta

3

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 Equals in superclasse e non può essere simmetrica (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC) , dove:

Questa classe definisce un metodo di uguale che sovrascrive un metodo di uguale in una superclasse. Entrambi i metodi metodi usano instanceof nella determinazione di se due oggetti sono uguali.

Questo è pieno di pericoli, poiché è importante che il metodo di uguale sia simmetrico (in altre parole, a.equals(b) == b.equals(a)).
Se B è un sottotipo di A, e A 's è uguale a controlli di metodo che l'argomento è un instanceof A e B di uguale metodo di verifica che l'argomento è un instanceof B, è molto probabile che la relazione di equivalenza definita da questi metodi non è simmetrica.


solo per le classi di attuazione Comparable e consente:

  • un'implementazione di uguali che è sempre la stessa;
  • tutte le logiche di confronto da collocare in un unico posto (la funzione compareTo());
  • la conformità con javadoc di Comparable#compareTo() che chiede di garantire che sia (x.compareTo(y)==0) == (x.equals(y)) (fortemente consigliato, ma non strettamente richiesto).
+0

Invertirei l'inizializzazione "boolean res" e il test di uguaglianza di classe. Quindi il codice "else" può essere spostato nella clausola "then". Penso che sia più facile da capire e meno incline agli errori. –

+0

@Randy: modello fisso – VonC

+0

Ma questo modello funziona solo se la classe implementa Comparable, giusto? Tutte le tue lezioni implementano Comparable? In tal caso, quali sono i vantaggi e ne vale la pena? – dhiller

2

un modello, ma io uso array.clone() invece di System.arraycopy(). C'è qualcosa di sbagliato in questo?

Edit: Un modello che uso nell'attuazione decoratore, soprattutto per un'interfaccia con molti metodi:

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

genera un'implementazione del metodo corrente delegando la chiamata a un esempio avvolto, impedendo così copia/incolla errori.

+0

clone su un array va bene.clonare su un oggetto non attendibile e non definitivo è un problema perché il clone potrebbe essere ignorato per fare qualcosa di sgradevole/stupido. –

+0

È diverso da Source/Genera metodi delegati? –

+0

Quindi una sottoclasse codificata maliziosa di java.util.Date potrebbe sovrascrivere l'operazione clone() per fare cose cattive, giusto? Se è così, dovrei regolare il modello di clone di conseguenza ... Qualche suggerimento? – dhiller