2012-01-25 28 views
5

Tôi có một lớp không thay đổibất biến của một lớp khi một biến thể hiện dưới dạng mảng danh sách

Giả sử tôi có phương thức getter cho biến thành viên kiểu ArrayList. Trong trường hợp đó khi tôi nhận được một tham chiếu đến biến đó, tôi có thể thêm hoặc xóa một phần tử khỏi nó. Trong trường hợp đó bất biến dường như bị vi phạm.

Có ai có thể giải thích khái niệm này chi tiết không?

+2

Xem http://stackoverflow.com/questions/8892350/immutable-vs-unmodifiable-collection – Zaki

+1

Xem thêm "Java hiệu quả" của Joshua Bloch, Mục 24: Tạo bản sao phòng thủ khi cần. Chương này có sẵn trực tuyến [tại đây] (http://www.informit.com/articles/article.aspx?p=31551&seqNum=2) – mike9322

+0

Nếu lớp học của bạn được cho là không thể thay đổi, hãy lưu tham chiếu vào danh sách _in class_ của bạn (sau khi sao chép) như một thể hiện của 'UnmodifiableList'. Không cần thêm các bản sao phòng thủ, và nó ngăn không cho lớp _your_ sửa đổi nó, trong quá trình bảo trì. –

Trả lời

3

Bạn thực sự đúng. Tính bất biến bị vi phạm.

Để làm cho một lớp không thay đổi, bạn cần phải đảm bảo rằng tất cả các getters của nó trả về các bản sao an toàn của bất kỳ lớp nào mà tiểu bang có thể thay đổi.

3

Bạn không được cung cấp loại biến số ArrayList. Cung cấp chỉ List và chắc chắn rằng các getter làm một trong những tiếp theo:

  1. trả về một bản sao của danh sách của bạn
  2. hoặc trả về danh sách unmodifiable

hoặc cả hai.

+1

Trả lại cả bản sao của danh sách cũng không thể sửa đổi được là không cần thiết –

0

nếu bạn tạo một phiên bản mới của đối tượng đã thay đổi loại X, thì trường hợp X sẽ được coi là không thay đổi. Sẽ dễ hiểu nếu bạn xem ArrayList của mình. Các phương thức YOu đã thay đổi danh sách này. Mỗi phương pháp thay đổi tạo một bản sao của danh sách này và thêm/xóa/cập nhật trên bản sao mới và quay trở lại.

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