Tôi đã truy cập chủ đề này, nhưng ngoài Wikipedia, tôi không tìm thấy bất kỳ tài liệu hoặc bài báo hữu ích nào khác.
Ai có thể giải thích cho tôi bằng những từ đơn giản nghĩa của nó hoặc giới thiệu cho tôi một số tài liệu hay và dễ hiểu được không?
Tôi đã truy cập chủ đề này, nhưng ngoài Wikipedia, tôi không tìm thấy bất kỳ tài liệu hoặc bài báo hữu ích nào khác.
Ai có thể giải thích cho tôi bằng những từ đơn giản nghĩa của nó hoặc giới thiệu cho tôi một số tài liệu hay và dễ hiểu được không?
Câu trả lời:
Nó không có ý nghĩa đặc biệt khi tham chiếu đến java.
Một bất biến của lớp chỉ đơn giản là một thuộc tính luôn giữ cho tất cả các trường hợp của một lớp, bất kể mã khác làm gì.
Ví dụ,
class X {
final Y y = new Y();
}
X có lớp bất biến rằng có một thuộc y
tính và nó là không bao giờ null
và nó có một giá trị kiểu Y
.
class Counter {
private int x;
public int count() { return x++; }
}
không duy trì được hai bất biến quan trọng
count
không bao giờ trả về giá trị âm vì có thể có dòng dưới.count
đang tăng lên một cách nghiêm túc.Lớp đã sửa đổi bảo toàn hai bất biến đó.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
nhưng không duy trì được bất biến mà lệnh gọi count
luôn thành công bình thường (không có vi phạm TCB † ) vì count
có thể ném ra một ngoại lệ hoặc nó có thể chặn nếu một luồng bị khóa sở hữu bộ giám sát của bộ đếm.
Mỗi ngôn ngữ có các lớp giúp dễ dàng duy trì một số bất biến của lớp nhưng không phải các lớp khác. Java cũng không ngoại lệ:
private
trường của chúng , vì vậy các bất biến dựa vào dữ liệu riêng tư rất dễ bảo trì.null
các giá trị lẻn vào theo nhiều cách, vì vậy rất khó để duy trì các bất biến "có giá trị thực".† - Vi phạm ngoại tác hoặc TCB là sự kiện mà nhà thiết kế hệ thống giả định một cách lạc quan là sẽ không xảy ra.
Thông thường, chúng tôi chỉ tin tưởng rằng phần cứng cơ bản hoạt động như được quảng cáo khi nói về các thuộc tính của các ngôn ngữ cấp cao được xây dựng trên chúng và các lập luận của chúng tôi mà các bất biến giữ lại không tính đến khả năng:
setAccessible
để sửa đổi private
các bảng tra cứu.Đối với một số hệ thống, TCB của chúng tôi có thể chỉ bao gồm các phần của hệ thống, vì vậy chúng tôi có thể không cho rằng
nhưng chúng ta có thể cho rằng
Hệ thống càng cấp cao, thì TCB của nó thường càng lớn, nhưng bạn càng có nhiều thứ không đáng tin cậy ra khỏi TCB của mình, thì khả năng bất biến của bạn càng được giữ vững và hệ thống của bạn sẽ càng đáng tin cậy về lâu dài.
count
không bao giờ trả về cùng một giá trị hai lần" có thực sự được coi là một lớp bất biến không?
Bất biến có nghĩa là một thứ gì đó phải tuân theo các điều kiện của nó cho dù có bất kỳ thay đổi nào hoặc bất kỳ ai sử dụng / biến đổi nó. Có nghĩa là, một thuộc tính của một lớp luôn đáp ứng hoặc thỏa mãn một số điều kiện ngay cả sau khi trải qua các phép biến đổi bằng cách sử dụng các phương thức public. Vì vậy, khách hàng hoặc người dùng của lớp này được đảm bảo về lớp và thuộc tính của nó.
Ví dụ,
Chúng là các dữ kiện phải đúng về một lớp thể hiện. Ví dụ: nếu một lớp có thuộc tính X và bất biến có thể là X phải lớn hơn 0. Theo hiểu biết của tôi, không có phương pháp tích hợp nào để duy trì các bất biến, bạn phải đặt thuộc tính riêng tư và đảm bảo rằng getters và setters của bạn thực thi thuộc tính bất biến.
Có sẵn các chú thích có thể kiểm tra các thuộc tính bằng cách sử dụng phản xạ và đánh chặn. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html