2013-04-25 37 views
5

Tôi có hai lớp: AbstractMailingDirectionsDirectionLoad. Cả hai đều có một constructor sao chép như sau:Nhà xây dựng bản sao Weird

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

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

Bây giờ khi tôi gọi constructor MailingDirections bản sao (mà chỉ super(toCopy) là) đôi khi tôi không nhận được các lĩnh vực của defaultDirection sao chép. Hay không phải tất cả. Và việc sử dụng trình gỡ rối Eclipse thậm chí còn lạ hơn:

Debugger tại đây tôi đã nhấp vào AbstractMailingDirections để sao chép. Xem cách defaultDirection.acceptanceTime là 17:00 trong bản in toString nhưng hiển thị null trong danh sách trường. Nếu tôi nhấp vào defaultDirection, đó là in toString sẽ hiển thị trường acceptanceTimenull.

Điều này khiến tôi phát điên. Bất cứ ý tưởng những gì có thể gây ra điều này?

+0

Sẽ hữu ích nếu bạn đăng [SSCCE] (http://sscce.org) để tái tạo hành vi. – npe

+4

Các thực thể Hibernate này (hoặc JPA hoặc tương tự)? Trong trường hợp đó truy cập vào các lĩnh vực có thể phanh ma thuật tải lười biếng và truy cập nó thông qua getters có thể sửa chữa nó. –

+0

Chết tiệt. @ JensSchauder mà chỉ có thể là nó. – vertti

Trả lời

2

Là những thực thể Hibernate (JPA hoặc hoặc tương tự)? Trong trường hợp đó truy cập vào các lĩnh vực có thể phanh ma thuật tải lười biếng & truy cập nó thông qua getters có thể sửa chữa nó.

1

bạn phải tạo đối tượng mới trong trình tạo bản sao của mình cho acceptTime. bạn chỉ nói sự tôn trọng nơi nó nên trỏ đến.

+0

Đây chủ yếu là vấn đề; thật khó để nói vì mã của OP không đầy đủ (ví dụ: chúng tôi không biết loại thuộc tính lớp), nhưng hàm tạo bản sao của 'DirectionLoad' chỉ đơn thuần là tạo bản sao nông. – adrianp

+0

'acceptTime' là LocalTime từ Joda nên nó không thay đổi và không quan trọng ở đây. – vertti

+0

bạn nói đúng, nếu nó không thay đổi thì không quan trọng. – duffy356

0

Tôi nghĩ mã đó làm gì, tiếp cận các đối tượng giống nhau với các tham chiếu khác nhau. Bạn cần phải sao chép các đối tượng. như thay vì

this.message = toCopy.message; 

bạn nên

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

Mặc dù bạn có nghĩa là điều đúng tôi nghĩ rằng ví dụ của bạn là xấu vì Strings là bất biến –

+0

Tôi cố gắng tạo một ví dụ dễ dàng nhưng bạn đúng đó là một ví dụ tồi. – Utk12

Các vấn đề liên quan