Tôi quyết định viết một danh sách liên kết đơn, và có kế hoạch đi vào để làm cho cấu trúc nút liên kết bên trong không thay đổi.
Tôi chạy vào một snag mặc dù. Nói rằng tôi có các nút được liên kết sau (từ các add
hoạt động trước ):
1 -> 2 -> 3 -> 4
và nói rằng tôi muốn nối thêm a 5
.
Để làm điều này, vì nút 4
là bất biến, tôi cần tạo một bản sao mới 4
, nhưng thay thế next
trường của nó bằng một nút mới chứa a 5
. Vấn đề là bây giờ, 3
là tham khảo cái cũ 4
; một mà không có phụ lục 5
. Bây giờ tôi cần sao chép 3
và thay thế next
trường của nó để tham chiếu 4
bản sao, nhưng bây giờ 2
là tham chiếu 3
...
Hay nói cách khác, để thực hiện nối thêm, toàn bộ danh sách dường như cần được sao chép.
Những câu hỏi của tôi:
Suy nghĩ của tôi có đúng không? Có cách nào để thực hiện nối thêm mà không sao chép toàn bộ cấu trúc không?
Rõ ràng "Java hiệu quả" chứa phần giới thiệu:
Các lớp học nên bất biến trừ khi có một lý do rất chính đáng để khiến chúng biến đổi ...
Đây có phải là một trường hợp tốt cho tính đột biến?
Tôi không nghĩ rằng đây là một bản sao của câu trả lời được đề xuất vì tôi không nói về danh sách đó; điều đó rõ ràng phải có thể thay đổi để phù hợp với giao diện (mà không làm gì đó như giữ danh sách mới bên trong và truy xuất nó thông qua một getter. Mặc dù vậy, ngay cả khi điều đó sẽ yêu cầu một số đột biến; nó sẽ chỉ được giữ ở mức tối thiểu). Tôi đang nói về việc liệu nội bộ của danh sách có phải là bất biến hay không.
CopyOnWritexxx
lớp cực kỳ đắt tiền được sử dụng cho đa luồng. Không ai mong đợi các bộ sưu tập sẽ thực sự bất biến (mặc dù nó tạo ra một số điều