Nó không có nghĩa là bất kỳ điều gì đặc biệt trong tham chiếu đến java.
Biến thể lớp đơn giản là thuộc tính chứa cho tất cả các phiên bản của một lớp, luôn luôn, bất kể mã nào khác.
Ví dụ,
class X {
final Y y = new Y();
}
X có lớp bất biến rằng có một tài sản y
và nó không bao giờ là null
và nó có một giá trị kiểu Y
.
class Counter {
private int x;
public int count() { return x++; }
}
thất bại trong việc duy trì hai bất biến quan trọng
- Đó
count
không bao giờ trả về một giá trị âm vì có thể underflow.
- Cuộc gọi đó đến
count
được tăng lên một cách đơn điệu.
Lớp được sửa đổi duy trì hai biến thể này.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
nhưng thất bại trong việc bảo tồn bất biến mà các cuộc gọi đến count
luôn thành công thường (vắng mặt TCB-vi phạm †) vì count
có thể ném một ngoại lệ hoặc nó có thể ngăn chặn nếu một sợi bế tắc sở hữu màn hình của quầy.
Mỗi ngôn ngữ có các lớp giúp dễ dàng duy trì một số biến thể của lớp học nhưng không phải là các biến thể khác. Java cũng không phải là ngoại lệ:
- Các lớp Java luôn có hoặc không có các thuộc tính và phương pháp, vì vậy bất biến giao diện dễ bảo trì.
- Các lớp Java có thể bảo vệ các trường
private
của chúng, vì vậy các bất biến dựa vào dữ liệu cá nhân rất dễ bảo trì.
- Các lớp Java có thể là cuối cùng, do đó các bất biến dựa vào không có mã vi phạm một bất biến bằng cách tạo ra một lớp con độc hại có thể được duy trì.
- Java cho phép các giá trị
null
ẩn danh theo nhiều cách, do đó rất khó để duy trì các giá trị bất biến "có giá trị thực".
- Java có chủ đề có nghĩa là các lớp không đồng bộ hóa gặp khó khăn trong việc duy trì các bất biến dựa trên các hoạt động tuần tự trong một chuỗi diễn ra cùng nhau.
- Java có ngoại lệ giúp dễ dàng duy trì các biến thể như "trả về kết quả với thuộc tính p hoặc trả về không có kết quả" nhưng khó duy trì các bất biến như "luôn trả về kết quả".
† - Một ngoại hoặc TCB vi phạm là một sự kiện mà một nhà thiết kế hệ thống một cách lạc quan giả định sẽ không xảy ra.
Thông thường chúng ta chỉ tin tưởng rằng các phần cứng cơ bản hoạt động như quảng cáo khi nói về tính chất của ngôn ngữ cấp cao được xây dựng trên họ, và lập luận của chúng tôi mà bất biến giữ không đưa vào tài khoản các khả năng:
- Một lập trình viên sử dụng các móc gỡ lỗi để thay đổi các biến cục bộ khi một chương trình chạy theo các cách mà mã không thể.
- Các đồng nghiệp của bạn không sử dụng phản chiếu với
setAccessible
để sửa đổi private
bảng tra cứu.
- Vật lý thay đổi Loki khiến bộ xử lý của bạn so sánh sai hai số.
Đối với một số hệ thống TCB của chúng tôi có thể chỉ bao gồm các bộ phận của hệ thống, vì vậy chúng tôi có thể không thừa nhận rằng
- Một quản trị viên hoặc daemon đặc quyền sẽ không giết quá trình JVM của chúng tôi,
nhưng chúng tôi có thể giả định rằng
- Chúng tôi có thể kiểm tra tới hệ thống tệp giao dịch đáng tin cậy.
Hệ thống cấp cao hơn, TCB của bạn càng lớn, nhưng những thứ không đáng tin cậy hơn bạn có thể thoát khỏi TCB, khả năng giữ bất biến của bạn càng nhiều và hệ thống của bạn càng đáng tin cậy hơn về lâu dài.
+1 cho câu hỏi vì trang Wikipedia có ví dụ thực sự tuyệt vời về điều tôi không biết bạn có thể làm - thậm chí còn có các ví dụ. Lời giải thích của họ tốt hơn tôi có thể làm cho bạn mặc dù; nó khá đơn giản. – iandisme
https://www.stanford.edu/~pgbovine/programming-with-rep-invariants.htm –
Nếu bạn quan tâm đến bất biến w.r.t. Java, có thể bạn sẽ quan tâm đến [hợp đồng cho Java] (http://google-opensource.blogspot.com/2011/02/contracts-for-java.html). –