2017-12-21 110 views
5

Sonar cho thấyCó ổn không khi sắp xếp các đối tượng dựa trên giá trị gia tăng nếu ứng dụng không bao giờ dựa vào nhận dạng đối tượng của nó?

Make giá trị này dựa trên lĩnh vực thoáng qua nên không được bao gồm trong serialization của lớp này.

Đây là lỗi trong tương lai khi lớp dựa trên giá trị sẽ được phát hành.

Vì vậy, nếu ứng dụng không bao giờ dựa vào nhận dạng đối tượng của nó, tôi có thể tạo các đối tượng dựa trên giá trị không tạm thời không?

Trả lời

6

Để tạo một trường của lớp không dựa trên giá trị, lớp dựa trên giá trị phải được tuần tự hóa. Vì vậy, nó thực sự là một quyết định thiết kế không phải do bạn thực hiện.

Nếu nhà thiết kế tuyên bố một lớp dựa trên giá trị và triển khai Serializable, họ giả định rằng các lớp dựa trên giá trị và tuần tự tương thích và sẽ vẫn như vậy.

Chúng tôi không biết, cách triển khai loại giá trị cuối cùng sẽ như thế nào, nhưng đường dẫn di chuyển do nhà phát triển JRE cung cấp, ví dụ: khi giới thiệu the immutable lists, being value based and serializable, cần được thực hiện, thay vì giả định rằng có các quy tắc và ràng buộc bổ sung ngoài đặc tả.

Sau cùng, không có lý do gì để giả định rằng tính năng Tuần tự hóa sẽ không hoạt động với các loại giá trị. Nó cũng hỗ trợ các giá trị nguyên thủy và cũng đã được điều chỉnh trong quá khứ, ví dụ: khi thêm enum hỗ trợ. Không rõ liệu nó sẽ luôn lưu trữ các giá trị sau đó hay vẫn hỗ trợ các tham chiếu ngược lại như với các đối tượng thông thường hoặc thực hiện một sự chuẩn hóa hoàn toàn khác, nhưng miễn là bạn không dựa vào nhận dạng đối tượng, như tiền đề của bạn mặt an toàn, vì một trong hai chiến lược sẽ làm việc với mã của bạn.

+0

bộ não nhỏ của tôi không tiêu hóa điều này, vì vậy về cơ bản chúng tôi nói đây là các loại giá trị + chúng thực hiện 'Serializable' => không bao giờ dựa vào danh tính của chúng (thông qua' == '?), Sử dụng bằng chứ? – Eugene

+3

@Eugene: luôn sử dụng 'equals' thay vì' == 'áp dụng cho các loại giá trị nói chung. Bây giờ, serialization lưu trữ và khôi phục danh tính bằng cách sử dụng các tham chiếu ngược đối với các đối tượng đã gặp, nhưng vì các kiểu giá trị có một danh tính không xác định, bạn không phải dựa vào điều này. Các phiên bản tương lai có thể hoạt động như thể sử dụng 'writeUnshared', nhưng ngược lại cũng có thể, giá trị bằng nhau có thể trở thành trường hợp giống nhau (nếu bạn cho rằng chúng vẫn là đối tượng)… – Holger

+0

cảm ơn bạn đã giữ cho đến 3AM đọc vấn đề serialization này (nếu chỉ SO có thể thanh toán hóa đơn của tôi trực tiếp ...). Vì vậy, nếu tôi serialize hai trường hợp (đó là 'bằng', nhưng không phải là '==') của 'Tùy chọn' ngày hôm nay tôi sẽ viết hai trường hợp khác nhau; trong một thế giới kiểu giá trị, tôi sẽ viết chỉ một. Nhưng vì họ không thay đổi tại sao điều này lại quan trọng? Nó không giống như bạn có thể nhận được một "mất cập nhật" thông qua 'writeObject' của hai viết tiếp theo? Tôi hy vọng tôi làm cho một số ý nghĩa ở đây – Eugene

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