Tôi nên chú thích như thế nào, rằng một lớp là bất biến trong Java?


14

Gần đây tôi đã tình cờ thấy các đối tượng bất biến hữu ích như thế nào và ví dụ như nếu bạn chuyển các phần tử cho một hàm tạo và lớp của bạn sẽ không thay đổi, bạn phải sao chép các phần tử này nếu chúng không tự biến đổi.

Điều này đòi hỏi rất nhiều kiểm tra hoặc kiến ​​thức về dự án của tôi, bởi vì nếu tôi có

public A(B foo)

Bkhông phải là bất biến, Atôi phải sao chép B. Bây giờ tưởng tượng Bcó vẻ bất biến, nhưng bản thân nó có các lớp có thể thay đổi trong hàm tạo và vân vân.

Có một tiêu chuẩn hoặc cách thực hành tốt nhất để ghi lại tài liệu nếu một lớp là bất biến trong Java? Có vẻ như không có @immutabletừ khóa trong Javadoc.

Các chú thích @Immutable có vẻ là một cái gì đó hoàn toàn khác nhau cho thế hệ lớp tự động và không nằm trong tiêu chuẩn Java.


2
Thứ nhất, sao chép phòng thủ cho phép bạn có được xung quanh đó. Thứ hai, cách để ghi lại nó là lớp Javadoc
raptortech97

"cách để ghi lại nó là lớp Javadoc" Có cách nào chuẩn để làm việc này không? Sau đó, đây sẽ là câu trả lời được chấp nhận.
Aufziehvogel 5/2/2015

@ raptortech97 Một trong những lợi thế chính của các lớp bất biến là không cần sao chép phòng thủ. Nếu phải có bản sao phòng thủ của một đối tượng được cho là bất biến, bạn đang làm sai.
itbruce 5/2/2015

1
@itsbruce Ông đã nói về việc sao chép các đối tượng có thể thay đổi. Ngoài ra, có một lý do để sao chép một đối tượng bất biến - bộ nhớ cache cục bộ. Một số người thu gom rác bảo tồn thứ tự tương đối của các đối tượng, vì vậy các đối tượng được phân bổ cùng ở lại với nhau.
Doval

Bạn đúng. Lỗi của tôi.
itbruce 5/2/2015

Câu trả lời:


7

Nhìn vào tài liệu của Stringlớp (văn bản in đậm là điều tôi đã làm):

Lớp String đại diện cho các chuỗi ký tự. Tất cả các chuỗi ký tự trong các chương trình Java, như "abc", được triển khai như các thể hiện của lớp này. Chuỗi không đổi; giá trị của chúng không thể thay đổi sau khi chúng được tạo. Bộ đệm chuỗi hỗ trợ chuỗi có thể thay đổi. Bởi vì các đối tượng String là bất biến nên chúng có thể được chia sẻ.

Như bạn có thể thấy, không có nhãn cụ thể hoặc các dấu hiệu khác, tuy nhiên, chúng chỉ định trong JavaDoc mô tả lớp mà Stringlớp đại diện cho một đối tượng không đổi, không thay đổi.

Do đó, giả sử rằng bạn đã làm theo các hướng dẫn được cung cấp trong này hướng dẫn Oracle để tạo ra một lớp bất biến, để đảm bảo rằng tính bất biến của lớp được ghi lại, bạn chỉ cần đảm bảo rằng bạn đã đề cập đến nó trong JavaDoc mô tả về lớp và những gì nó làm.

Nếu điều đó vẫn không phù hợp với những gì bạn cần, bạn có thể xem cách bạn có thể xây dựng các thẻ JavaDoc tùy chỉnh ở đây .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.