Có một vài trường hợp bạn muốn sử dụng bản đồ, danh sách, bộ hoặc các loại bộ sưu tập bất biến khác.
Trường hợp sử dụng đầu tiên và được cho là quan trọng nhất là bất cứ khi nào bạn trả về kết quả của truy vấn hoặc tính toán sẽ trả về một tập hợp (hoặc danh sách hoặc bản đồ) kết quả, bạn nên sử dụng cấu trúc dữ liệu không thay đổi.
Trong trường hợp này, tôi rất thích trả về các phiên bản bất biến của các phiên bản này vì điều này phản ánh tính bất biến thực tế của một kết quả tính toán rõ ràng hơn - bất kể bạn làm gì với dữ liệu sau này, không nên đặt kết quả bạn nhận được từ truy vấn của mình thay đổi.
Trường hợp sử dụng phổ biến thứ hai là khi bạn cần cung cấp một đối số làm đầu vào cho một phương thức hoặc dịch vụ. Trừ khi bạn mong đợi bộ sưu tập đầu vào được sửa đổi bởi dịch vụ hoặc phương thức (thường là một ý tưởng thiết kế thực sự tồi tệ), chuyển qua một bộ sưu tập bất biến thay vì bộ sưu tập có thể thay đổi có thể là lựa chọn hợp lý và an toàn trong nhiều trường hợp.
Tôi nghĩ về nó như là quy ước "vượt qua giá trị" .
Tổng quát hơn - đó là một cách thực hành hợp lý để sử dụng cấu trúc dữ liệu bất biến mỗi khi dữ liệu vượt qua ranh giới mô-đun hoặc dịch vụ. Điều này làm cho lý do dễ dàng hơn nhiều về sự khác biệt giữa đầu vào / đầu ra (không thay đổi) và trạng thái bên trong có thể thay đổi.
Vì tác dụng phụ rất có lợi của việc này là tăng tính bảo mật và an toàn luồng cho các mô-đun / dịch vụ của bạn và đảm bảo phân tách mối quan tâm rõ ràng hơn.
Một lý do chính đáng khác để sử dụng Collections.empty*()
các phương pháp là sự thiếu rõ ràng đáng chú ý của chúng. Trong thời kỳ tiền Java7, nếu bạn có một bộ sưu tập chung, bạn phải rắc các chú thích loại chung ở khắp mọi nơi.
Chỉ cần so sánh hai tuyên bố này:
Map<Foo, Comparable<? extends Bar>> fooBarMap = new HashMap<Foo, Comparable<? extends Bar>>();
đấu với:
Map<Foo, Comparable<? extends Bar>> fooBarMap = Collections.emptyMap();
Loại thứ hai rõ ràng sẽ thắng dễ dàng theo hai cách quan trọng:
- Trong tuyên bố đầu tiên, toàn bộ việc khởi tạo một bản đồ trống bị chôn vùi trong tiếng ồn của các khai báo kiểu chung, làm cho một tuyên bố cơ bản tầm thường khó hiểu hơn nhiều so với yêu cầu.
- Ngoài việc thiếu chú ý loại chung chung ở phía bên phải, phiên bản thứ hai nêu rõ rằng bản đồ được khởi tạo thành một bản đồ trống. Ngoài ra - biết rằng phương thức này trả về một bản đồ bất biến, giờ đây tôi dễ dàng tìm thấy nơi
fooBarMap
đang được gán một giá trị không trống khác chỉ bằng cách tìm kiếm /fooBarMap =/
.