Đây là một câu hỏi cũ, nhưng tôi nghĩ rằng dù sao tôi cũng sẽ đóng góp 2 xu kể từ khi chủ đề này xuất hiện trong cuộc trò chuyện ngày hôm nay.
Điều này không trả lời chính xác tại sao không có const? nhưng làm thế nào để làm cho lớp học của bạn bất biến. (Thật không may, tôi chưa đủ danh tiếng để đăng bình luận cho câu trả lời được chấp nhận)
Cách để đảm bảo tính bất biến trên một đối tượng là thiết kế các lớp của bạn cẩn thận hơn để trở thành bất biến. Điều này đòi hỏi một chút quan tâm hơn một lớp đột biến.
Điều này quay trở lại Mục 15 hiệu quả của Josh Bloch - Giảm thiểu tính tương tác . Nếu bạn chưa đọc cuốn sách này, hãy lấy một bản sao và đọc nó vài lần tôi đảm bảo nó sẽ giúp bạn "chơi trò chơi java" theo nghĩa bóng .
Trong mục 15 Bloch đề xuất rằng bạn nên hạn chế khả năng biến đổi của các lớp để đảm bảo trạng thái của đối tượng.
Để trích dẫn cuốn sách trực tiếp:
Một lớp bất biến chỉ đơn giản là một lớp mà các thể hiện của chúng không thể được sửa đổi. Tất cả thông tin chứa trong mỗi phiên bản được cung cấp khi nó được tạo và được cố định trong suốt vòng đời của đối tượng. Các thư viện nền tảng Java chứa nhiều lớp bất biến, bao gồm String, các lớp nguyên thủy được đóng hộp và BigInte-ger và BigDecimal. Có nhiều lý do tốt cho việc này: Các lớp bất biến dễ thiết kế, thực hiện và sử dụng hơn các lớp có thể thay đổi. Họ ít bị lỗi và an toàn hơn.
Bloch sau đó mô tả cách làm cho các lớp của bạn bất biến, bằng cách làm theo 5 quy tắc đơn giản:
- Không cung cấp bất kỳ phương thức nào sửa đổi trạng thái của đối tượng (ví dụ: setters, hay còn gọi là trình biến đổi )
- Đảm bảo rằng lớp không thể được mở rộng (điều này có nghĩa là khai báo chính lớp đó
final
).
- Làm tất cả các lĩnh vực
final
.
- Làm tất cả các lĩnh vực
private
.
- Đảm bảo quyền truy cập độc quyền vào bất kỳ thành phần đột biến. (bằng cách tạo các bản sao phòng thủ của các đối tượng)
Để biết thêm chi tiết, tôi khuyên bạn nên chọn một bản sao của cuốn sách.
const
từ khóa, nhưng không có tính năng cơ bản. Sửa tiêu đề và thẻ của bạn cho phù hợp.