2010-02-02 40 views
43

Từ javadocs ImmutableList:Sự khác nhau giữa danh sách ImmutableList và Collections.unmodifiableList() của google là gì?

Không giống như Collections.unmodifiableList (java.util.List), đó là một cái nhìn của một riêng biệt bộ sưu tập mà vẫn có thể thay đổi, một thể hiện của ImmutableList chứa riêng dữ liệu và sẽ không bao giờ thay đổi. ImmutableList thuận tiện cho danh sách tĩnh chung công khai ("danh sách liên tục") và cũng cho phép bạn dễ dàng tạo "bản sao phòng thủ" trong danh sách được cung cấp cho lớp của bạn bởi người gọi .

Liệu nó có nghĩa là:

  1. nếu tôi có ImmutableList của Dimension đối tượng (ví dụ) sau đó tôi không thể thay đổi bất kỳ đối tượng Dimension trong nó?
  2. và nếu tôi có Collections.unmodifiableList (danh sách) của đối tượng Thứ nguyên thì tôi không thể thêm hoặc xóa bất kỳ đối tượng nào nhưng tôi có thể thay đổi chúng (ví dụ: gọi phương thức setDimension (width, height))?
+1

Bạn cũng có thể muốn xem [Sự khác nhau giữa Collections.unmodifiableSet() và ImmutableSet of Guava] (http://stackoverflow.com/q/5611324/977087) – Crowie

Trả lời

52

Không, bất biến chỉ được áp dụng cho số lượng và tham chiếu của đối tượng trong Bộ sưu tập và không giải quyết được tính dễ bị tổn thương của đối tượng bạn đưa vào Bộ sưu tập.

Danh sách không thể đạt được trong danh sách JDK Collections.unmodifiableList tiêu chuẩn là sử dụng ImmutableList bạn được đảm bảo rằng các đối tượng được tham chiếu, thứ tự của chúng và kích thước của danh sách không thể thay đổi từ bất kỳ nguồn nào. Với Collections.unmodifiableList nếu một cái gì đó khác có một tham chiếu đến danh sách cơ bản, mã đó có thể sửa đổi danh sách ngay cả khi bạn có một tham chiếu đến một danh sách không thể sửa đổi được.

Nếu, tuy nhiên, bạn muốn bất biến thực sự, bạn phải điền vào danh sách với các đối tượng không thể thay đổi.

+0

Và tất nhiên, luôn có phản ánh ... – naiad

+0

@Vuntic, nếu lớp thực sự không thay đổi được, các trường của nó được khai báo cuối cùng và sự phản chiếu không thể thay đổi điều đó. – Yishai

+1

@Yishai, reflection * có thể * sửa đổi các trường cuối cùng. Thử nó. – naiad

14

Sử dụng Collections.unmodifiableList tạo trình bao bọc xung quanh Danh sách của bạn. nếu danh sách cơ bản thay đổi, thì chế độ xem unmodifiableList của bạn cũng vậy.

Theo tài liệu, mã của Google tạo bản sao. Đó là một tính toán đắt tiền hơn và tiêu thụ nhiều bộ nhớ hơn, nhưng nếu ai đó thay đổi danh sách ban đầu, nó không thể ảnh hưởng đến ImmutableList.

Cả trong số này sẽ ngăn cản bạn từ việc thay đổi một đối tượng trong một danh sách, hoặc đó là các lĩnh vực, hoặc lĩnh vực lĩnh vực vv

+2

"Như tài liệu nói, mã của Google tạo một bản sao." Nó * có thể * tạo một bản sao. Nếu bản gốc cũng là một cấu trúc dữ liệu bất biến, nó thực sự có thể tái sử dụng nó. Vì vậy, nếu bạn sử dụng 'ImmutableList' rộng rãi, bạn sẽ nhấn trường hợp này rất thường xuyên và sẽ không phải sao chép rất nhiều. –

3
  1. Không, các đối tượng cá nhân chứa vẫn có thể được sửa đổi. Bộ sưu tập thực sự chỉ lưu trữ các tài liệu tham khảo vào các đối tượng chứa, chứ không phải bản sao đầy đủ của mọi đối tượng.
  2. Bạn có thể sửa đổi danh sách bằng cách sửa đổi Bộ sưu tập gốc mà bạn gọi là Bộ sưu tập.unmodifiableList (danh sách) trên đó. Nhưng có, bạn CÓ THỂ sử dụng setDimension để thay đổi một phần tử danh sách được lưu trữ.
6

ImmutableList tương tự như Collections.unmodifiableList(new ArrayList(list)). Lưu ý rằng ArrayList mới được tạo là không phải được gán cho một trường hoặc biến.

0

Bạn cũng có thể muốn xem this question (Sự khác biệt giữa Collections.unmodifiableSet()ImmutableSet của Ổi) là gì.

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