Khi làm khởi lười biếng của một singleton tĩnh trong Java bạn có thể làm điều này:Chúng ta có thể tải xuống không đau của một thành viên Java theo cách tương tự như cách chúng ta có thể với các trình đơn tĩnh không?
public class Bob {
private static class SingletonWrapper {
private static final Bob instance = new Bob();
}
public static Bob getInstance() {
return SingletonWrapper.instance;
}
}
Bởi vì lớp bên trong SingletonWrapper
chỉ nạp khi lần đầu tiên truy cập vào Bob()
không được tạo ra cho đến khi getInstance()
được gọi.
Câu hỏi của tôi là liệu có bất kỳ thủ thuật tương tự nào có thể được sử dụng để thực hiện việc khởi tạo lười biếng của biến thành viên trong ngữ cảnh không tĩnh hay không.
public class Bob {
// Clearly this doesn't work as not lazy
private final InnerWrapper wrapper = new InnerWrapper();
private class InnerWrapper {
private final Jane jane = new Jane();
}
public Jane getJane() {
return wrapper.jane;
}
}
Có cách nào chúng ta có thể có một thể hiện của Jane
trong Bob
và sợi một cách an toàn có trường hợp duy nhất được tạo ra theo yêu cầu mà không sử dụng đôi khóa séc hoặc AtomicReference
. Lý tưởng nhất là phương thức get nên đơn giản như trong ví dụ này, nhưng nếu điều đó là không thể thì việc thực hiện đơn giản và nhanh nhất có thể (hiệu quả nhất) của phương thức get
là lý tưởng.
@assylias Khi bình luận nói rằng sẽ không làm khởi lười biếng. Ngay sau khi bạn tạo một 'Bob' bạn cũng luôn luôn và ngay lập tức tạo ra một' Jane'. –
Tội nghiệp của tôi tôi đọc quá nhanh - bất kỳ lý do nào bạn không muốn có một AtomicReference? Nó có thể sẽ hoạt động tốt hơn tùy chọn CHM. – assylias
@assylias Không có lý do cụ thể. Về cơ bản, tôi chỉ muốn biết những lựa chọn của tôi là gì - xem xét thủ thuật wrapper tĩnh đơn giản và hiệu quả như thế nào cho việc khởi tạo lười biếng của những người độc thân đó là một sự xấu hổ, chúng ta không thể nghĩ ra điều gì đó tương tự cho việc khởi tạo lười biếng của các thành viên, –