2013-04-25 18 views
5

Ho due classi: AbstractMailingDirections e DirectionLoad. Entrambi hanno un costruttore di copia come segue:Costruttore di copie strano

public AbstractMailingDirections(AbstractMailingDirections toCopy) { 
    this.message = toCopy.message; 
    this.defaultDirection = new DirectionLoad(toCopy.defaultDirection); 
    for (final DirectionLoad dls : toCopy.directionLoads) { 
     this.directionLoads.add(new DirectionLoad(dls)); 
    } 
} 

e

public DirectionLoad(DirectionLoad toCopy) { 
    this.direction = toCopy.direction; 
    this.transportationContract = toCopy.transportationContract; 
    this.pickUpTime = toCopy.pickUpTime; 
    this.acceptanceTime = toCopy.acceptanceTime; 
    this.acceptanceLocation = toCopy.acceptanceLocation; 
    this.information = toCopy.information; 
} 

Ora, quando io chiamo il costruttore MailingDirections copia (che è solo super(toCopy)) A volte non si ottiene campi della defaultDirection copiato. O non tutti loro. E l'utilizzo di un debugger Eclipse è ancora più strano:

Debugger qui ho cliccato sul AbstractMailingDirections da copiare. Guarda come defaultDirection.acceptanceTime è 17:00 nella stampa toString ma mostra null nell'elenco dei campi. Se faccio clic su defaultDirection, è la stampa toString mostrerà il campo acceptanceTime come null.

Questo mi sta facendo impazzire. Qualche idea su cosa potrebbe causare questo?

+0

Sarebbe utile se hai pubblicato un [SSCCE] (http://sscce.org) che riproduce il comportamento. – npe

+4

Queste entità Hibernate (o JPA o simili)? In tal caso, l'accesso ai campi potrebbe frenare la magia del caricamento pigro e accedervi tramite i Getter potrebbe ripararlo. –

+0

Accidenti. @JensSchauder che potrebbe essere proprio questo. – vertti

risposta

2

Sono queste entità Hibernate (o APP o simili)? In tal caso, l'accesso ai campi potrebbe frenare la magia di caricamento lenta & accedendovi tramite Getter potrebbe ripararlo.

1

è necessario creare un nuovo oggetto nel costruttore di copia per AcceptTime. si limita a dire all'arbitro dove dovrebbe puntare.

+0

Questo è principalmente il problema; è difficile da dire perché il codice dell'OP è incompleto (ad esempio non conosciamo i tipi di attributi della classe), ma il costruttore di copia di 'DirectionLoad' sta semplicemente producendo una copia superficiale. – adrianp

+0

'acceptanceTime' è LocalTime di Joda quindi è immutabile e non dovrebbe avere importanza qui. – vertti

+0

hai ragione, se è immutabile non importa. – duffy356

0

Penso che cosa faccia quel codice, raggiunga gli stessi oggetti con riferimenti diversi. Hai bisogno di copiare oggetti. come invece di

this.message = toCopy.message; 

si dovrebbe

this.message = new String(toCopy.message); 
+2

Anche se intendi la cosa giusta, penso che il tuo esempio sia sbagliato poiché le stringhe sono immutabili –

+0

Provo a fare un esempio semplice ma hai ragione è un cattivo esempio. – Utk12

Problemi correlati