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)
È stato utile?

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)).
  Se B è un sottotipo di A e A di uguale controlli 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.


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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top