Nhóm Java đã thực hiện rất nhiều công việc tuyệt vời để loại bỏ các rào cản đối với lập trình chức năng trong Java 8. Đặc biệt, các thay đổi đối với Bộ sưu tập java.util thực hiện rất tốt việc chuyển đổi các chuỗi thành các hoạt động truyền phát rất nhanh. Xem xét công việc họ đã thực hiện tốt như thế nào khi thêm các hàm hạng nhất và phương thức chức năng vào các bộ sưu tập, tại sao họ hoàn toàn thất bại trong việc cung cấp các bộ sưu tập bất biến hoặc thậm chí các giao diện bộ sưu tập bất biến?
Không thay đổi bất kỳ mã hiện có nào, nhóm Java bất cứ lúc nào cũng có thể thêm các giao diện bất biến giống như các giao diện có thể thay đổi, trừ các phương thức "thiết lập" và làm cho các giao diện hiện có mở rộng từ chúng, như sau:
ImmutableIterable
____________/ |
/ |
Iterable ImmutableCollection
| _______/ / \ \___________
| / / \ \
Collection ImmutableList ImmutableSet ImmutableMap ...
\ \ \_________|______________|__________ |
\ \___________|____________ | \ |
\___________ | \ | \ |
List Set Map ...
Chắc chắn, các hoạt động như List.add () và Map.put () hiện trả về giá trị boolean hoặc trước đó cho khóa đã cho để cho biết thao tác thành công hay thất bại. Các bộ sưu tập bất biến sẽ phải xử lý các phương thức như các nhà máy và trả lại một bộ sưu tập mới có chứa phần tử được thêm vào - không tương thích với chữ ký hiện tại. Nhưng điều đó có thể được giải quyết bằng cách sử dụng một tên phương thức khác như ImmutableList.append () hoặc .addAt () và ImmutableMap.putEntry (). Độ dài kết quả sẽ lớn hơn nhiều so với lợi ích của việc làm việc với các bộ sưu tập không thay đổi và hệ thống loại sẽ ngăn các lỗi gọi phương thức sai. Theo thời gian, các phương pháp cũ có thể bị phản đối.
Thắng các bộ sưu tập bất biến:
- Đơn giản - lý luận về mã đơn giản hơn khi dữ liệu cơ bản không thay đổi.
- Tài liệu - nếu một phương thức có giao diện bộ sưu tập bất biến, bạn biết rằng nó sẽ không sửa đổi bộ sưu tập đó. Nếu một phương thức trả về một bộ sưu tập bất biến, bạn biết bạn không thể sửa đổi nó.
- Đồng thời - bộ sưu tập bất biến có thể được chia sẻ an toàn trên các chủ đề.
Là một người đã nếm trải các ngôn ngữ giả định sự bất biến, rất khó để quay trở lại miền Tây hoang dã của sự đột biến tràn lan. Các bộ sưu tập của Clojure (trừu tượng hóa chuỗi) đã có mọi thứ mà các bộ sưu tập Java 8 cung cấp, cộng với tính không thay đổi (mặc dù có thể sử dụng thêm bộ nhớ và thời gian do danh sách liên kết được đồng bộ hóa thay vì các luồng). Scala có cả bộ sưu tập có thể thay đổi và bất biến với một bộ đầy đủ các thao tác và mặc dù các thao tác đó rất háo hức, việc gọi .iterator đưa ra một cái nhìn lười biếng (và có nhiều cách khác để đánh giá chúng một cách lười biếng). Tôi không thấy Java có thể tiếp tục cạnh tranh như thế nào nếu không có các bộ sưu tập bất biến.
Ai đó có thể chỉ cho tôi lịch sử hoặc thảo luận về điều này? Chắc chắn nó ở nơi nào đó.
const
bộ sưu tập
Collections.unmodifiable*()
dành cho. nhưng đừng coi những điều này là bất biến khi chúng không
ImmutableList
trong sơ đồ đó, mọi người có thể vượt qua trong một đột biến List
? Không, đó là một sự vi phạm LSP rất tệ.