2010-05-20 34 views

Trả lời

30

Trong khi các lớp không thể thay đổi của ổi là chủ đề an toàn, người xây dựng của họ thì không. Đối với hầu hết các ứng dụng, chỉ có một luồng sẽ tương tác với bất kỳ cá thể Builder cụ thể nào.

Trong trường hợp không có an toàn luồng thường không cần phải được ghi lại, thì Javadoc có thể có ý nghĩa đối với các nhà xây dựng bộ sưu tập không thể thay thế. Mọi người có thể ngạc nhiên rằng ImmutableList là chủ đề an toàn trong khi ImmutableList.Builder thì không.

+0

Bạn có bằng chứng không? Bài viết "Bộ sưu tập không thể thay đổi" (https://github.com/google/guava/wiki/ImmutableCollectionsExplained) cho biết "Các đối tượng không thể thay đổi có thể được sử dụng bởi nhiều chủ đề" nhưng nó không rõ ràng nói "Bộ sưu tập không thể xóa được chủ đề an toàn" . Tôi vẫn chưa tin :-( – 30thh

13

Nếu chủ đề an toàn không được đề cập trong javadocs, đừng giả sử nó!

Nghiêm trọng hơn, "không".

Tôi cũng thích javadocs của ImmutableList và bạn bè bao gồm một sự hiểu biết rõ ràng, có - nhận xét (vì vậy bạn sẽ không phải tự mình giả định), bởi vì "hiển nhiên" không phải lúc nào cũng như vậy. Mới hôm nọ tôi đang thảo luận về scala.List, một danh sách bất biến, và một số vấn đề nổi bật có thể gây ra nếu trao đổi giữa các chủ đề không thích hợp (thông qua một cuộc đua dữ liệu), mà mọi người không nghĩ đến vì họ thấy từ "bất biến" , cộng với chúng tương đương "bất biến == thread-safe", vì vậy nó trả tiền để được ở bên an toàn ngay cả khi ghi lại các khía cạnh an toàn chủ đề "rõ ràng".

2

Đồng ý với @Dimitris Andreou: chắc chắn không đảm bảo an toàn chủ đề nếu không được ghi nhận như vậy. Khi bạn đi đến nỗ lực tạo ra một chủ đề lớp không tầm thường, bạn muốn người dùng biết điều đó.

Ngoài ra, tôi nghĩ trường hợp sử dụng phổ biến nhất đối với người xây dựng sẽ bị giới hạn theo chủ đề: ví dụ như biến cục bộ trong một số phương pháp. Nếu bạn cần nhiều chủ đề để xây dựng một Danh sách, thực sự là bất biến chưa?

Nếu bạn có nhiều chủ đề đưa vào danh sách, nhưng muốn chụp nhanh một lúc nào đó và nói "không còn thay đổi về sau, không thay đổi" thì tôi sẽ viết thứ gì đó lấy các phần tử từ các chủ đề đó và đóng băng nội dung vào một ImmutableList mới khi bạn biết nó đã sẵn sàng.

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