2013-04-25 7 views
5

Mam dwie klasy: AbstractMailingDirections i DirectionLoad. Obie mają konstruktor kopiujący następująco:Konstruktor dziwnego egzemplarza

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)); 
    } 
} 

i

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; 
} 

Teraz gdy zgłoszę konstruktora MailingDirections kopiowania (który jest tylko super(toCopy)) czasami nie dostać pól z defaultDirection kopiowane. A może nie wszystkie. A korzystanie z debuggera Eclipse jest jeszcze dziwniejsze:

Debugger Tutaj kliknąłem na plik AbstractMailingDirections, który ma zostać skopiowany. Zobacz, jak defaultDirection.acceptanceTime ma 17:00 na wydruku toString, ale w wykazie jest wyświetlany null. Jeśli kliknę przycisk domyślny, zostanie wyświetlony komunikat toString, który pokaże pole acceptanceTime jako null.

To doprowadza mnie do szału. Jakieś pomysły, które mogą być przyczyną tego?

+0

Byłoby pomocne, gdyby opublikowano [SSCCE] (http://sscce.org), który odtwarza zachowanie. – npe

+4

Czy są to elementy hibernacji (lub JPA lub podobne)? W takim przypadku dostęp do pól może zahamować magię leniwego ładowania, a dostęp do niej za pomocą modułów pobierających może ją naprawić. –

+0

Cholera. @JensSchauder, po prostu może to być. – vertti

Odpowiedz

2

Czy te podmioty hibernacji (lub JPA lub podobne)? W takim przypadku dostęp do pól może zahamować leniwą magię ładowania, dostęp do niej za pośrednictwem modułów pobierających może ją naprawić.

1

musisz utworzyć nowy obiekt w swoim konstruktorze kopiowania dla acceptTime. mówisz tylko o tym, do czego powinno to wskazywać.

+0

Jest to głównie problem; ciężko powiedzieć, ponieważ kod OP jest niekompletny (np. nie znamy typów atrybutów klasowych), ale konstruktor kopii 'DirectionLoad' tworzy jedynie płytką kopię. – adrianp

+0

'acceptTime' jest LocalTime od Joda, więc jest niezmienny i nie powinno mieć znaczenia tutaj. – vertti

+0

masz rację, jeśli jest niezmienna, to nie ma znaczenia. – duffy356

0

Myślę, że to, co robi ten kod, dociera do tych samych obiektów z różnymi referencjami. Musisz skopiować obiekty. jak zamiast

this.message = toCopy.message; 

należy

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

Chociaż masz na myśli dobrą rzecz, myślę, że Twój przykład jest zły, ponieważ Ciągi są niezmienne –

+0

Próbuję zrobić prosty przykład, ale masz rację, to zły przykład. – Utk12

Powiązane problemy