Domanda

Questo è un esempio di copia difensiva in Java efficace. Supponiamo che lo scenario nelle mie domande sottostanti abbia bisogno di una copia difensiva e non può fare con un commento che chiede al cliente di evitare gli oggetti mutanti passati.

public Period(Date start, Date end) {
    this.start = new Date(start.getTime());
    this.end = new Date(end.getTime());
}
.

Domande:

    .
  1. Cosa fare se Date non ha avuto un costruttore per prendermi dentro, per rendere il mio sé più generale, un oggetto è passato senza meccanismo per replicare se stesso, e tale oggetto non ci appartiene, cioè noi non posso cambiarlo in alcun modo?

  2. Cosa succede se il costruttore ha preso il parametro di tipo come argomento, dire Period(T object) e T potrebbe essere mutabile, quindi ha bisogno di copia difensiva. Non abbiamo idea di ciò che è T. Come fare copia difensiva in questo caso?

  3. Cos'è un'interfaccia è passata dove alcune delle sue sottoclassi hanno un costruttore come Date per creare un oggetto di se stesso e alcune delle sue sottoclassi non hanno alcun meccanismo da fare?

  4. Quanto è profondo copiare difensivamente? Diciamo che abbiamo copiato un array, ma gli elementi dell'array erano mutabili?

È stato utile?

Soluzione

    .
  1. Se tutto il suo stato è disponibile, puoi estrarre il suo stato e costruire un nuovo oggetto da solo. Altrimenti, non puoi fare nulla al riguardo, tranne che usando brutti trucchi di riflessione o serializzazione.
  2. Se T non è un'istanza di una classe che consente di copiare se stesso, non puoi fare nulla.
  3. non puoi fare nulla al riguardo.
  4. dipende.
  5. Leggendo la tua domanda, sembra che vorresti applicare la consulenza "copia difensiva" ovunque. Non dovresti. La maggior parte delle volte, il codice utilizzando oggetti mutabili desidera un riferimento all'oggetto originale e non una copia. Soprattutto se ciò che ottieni come argomento è un'istanza di una classe o un'interfaccia astratta.

    Sei costretto a fare una copia di date difensiva perché è il tipo di valore mutabile che non dovrebbe essere mutabile e non sarebbe se fosse stato progettato correttamente. Se promuovi l'immutabilità per i tipi di valore, allora le copie difensive diventano inutili. Per i tipi di non valore, in genere non si desidera una copia, ma un riferimento all'oggetto.

Altri suggerimenti

    .
  1. Se non è possibile modificare comunque lo stato dell'oggetto, non è necessario una copia difensiva.
  2. L'unica cosa che puoi fare è assumere probabile implementazione di T e controllarle con Instanceof .
  3. come 2.
  4. a tua discrezione.Se si suppone che la modifica degli elementi di array possa interrompere il tuo programma in un altro posto, dovresti copiarli anche tutti.

Programmazione difensiva conta che gli oggetti che passano a un metodo sono mutabili.Una buona pratica (descritta anche nell'efficace libro Java) è renderle immutabile.

    .
  1. Se la classe della data non è definitiva, è possibile scrivere una classe wrapper per questo, cioè sottoclasse di data.
  2. dipende.Probabilmente, non ci sarà bisogno di clonarlo.
  3. Non dovrebbe disturbarti.L'implementore di un'interfaccia dovrebbe prendersi cura dei problemi di sincronizzazione.Generalmente, è una buona pratica passare le interfacce invece delle loro implementazioni.
  4. Per le collezioni Java standard ci sono molti metodi di utilità nella classe Java.util.Collections, come AMMODIFIIBLELIST E UNMODIFIABLAMAP, destinati a utilizzare per la programmazione difensiva.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top