Cuối cùng không giống như là bất biến.
final != immutable
Các final
từ khóa được sử dụng để đảm bảo rằng các tài liệu tham khảo là không thay đổi (có nghĩa là, các tài liệu tham khảo nó đã không thể được thay thế bằng một cái mới)
Tuy nhiên, nếu thuộc tính là self có thể sửa đổi được thì bạn có thể thực hiện những gì bạn vừa mô tả.
Ví dụ
class SomeHighLevelClass {
public final MutableObject someFinalObject = new MutableObject();
}
Nếu chúng ta khởi tạo lớp này, chúng ta sẽ không thể gán giá trị khác cho thuộc tính someFinalObject
vì nó là thuộc tính cuối cùng .
Vì vậy, điều này là không thể:
....
SomeHighLevelClass someObject = new SomeHighLevelClass();
MutableObject impostor = new MutableObject();
someObject.someFinal = impostor;
Nhưng nếu đối tượng tự nó có thể thay đổi như thế này:
class MutableObject {
private int n = 0;
public void incrementNumber() {
n++;
}
public String toString(){
return ""+n;
}
}
Sau đó, giá trị được chứa bởi đối tượng có thể thay đổi đó có thể bị thay đổi.
SomeHighLevelClass someObject = new SomeHighLevelClass();
someObject.someFinal.incrementNumber();
someObject.someFinal.incrementNumber();
someObject.someFinal.incrementNumber();
System.out.println( someObject.someFinal );
Điều này có tác dụng tương tự như bài đăng của bạn:
public static void addProvider(ConfigurationProvider provider) {
INSTANCE.providers.add(provider);
}
Ở đây, bạn không thay đổi giá trị của INSTANCE, bạn đang sửa đổi trạng thái bên trong của nó (thông qua, phương thức provider.add)
nếu bạn muốn ngăn việc định nghĩa lớp phải được thay đổi như thế này:
public final class ConfigurationService {
private static final ConfigurationService INSTANCE = new ConfigurationService();
private List providers;
private ConfigurationService() {
providers = new ArrayList();
}
....
Nhưng, nó có thể không có nhiều ý nghĩa :)
Nhân tiện, bạn cũng phải đồng bộ hóa quyền truy cập vào nó về cơ bản vì lý do tương tự.