Tôi đã đọc bài viết của Singleton trên Wikipedia và tôi đã xem qua ví dụ này:
public class Singleton {
// Private constructor prevents instantiation from other classes
private Singleton() {}
/**
* SingletonHolder is loaded on the first execution of Singleton.getInstance()
* or the first access to SingletonHolder.INSTANCE, not before.
*/
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
Mặc dù tôi thực sự thích cách Singleton này hoạt động, tôi không thể thấy cách điều chỉnh nó để kết hợp các đối số với hàm tạo. Cách ưa thích để làm điều này trong Java là gì? Tôi sẽ phải làm một cái gì đó như thế này?
public class Singleton
{
private static Singleton singleton = null;
private final int x;
private Singleton(int x) {
this.x = x;
}
public synchronized static Singleton getInstance(int x) {
if(singleton == null) singleton = new Singleton(x);
return singleton;
}
}
Cảm ơn!
Chỉnh sửa: Tôi nghĩ rằng tôi đã bắt đầu một cơn bão tranh cãi với mong muốn sử dụng Singleton. Hãy để tôi giải thích động lực của tôi và hy vọng ai đó có thể đề xuất một ý tưởng tốt hơn. Tôi đang sử dụng một khung tính toán lưới để thực hiện các nhiệm vụ song song. Nói chung, tôi có một cái gì đó như thế này:
// AbstractTask implements Serializable
public class Task extends AbstractTask
{
private final ReferenceToReallyBigObject object;
public Task(ReferenceToReallyBigObject object)
{
this.object = object;
}
public void run()
{
// Do some stuff with the object (which is immutable).
}
}
Điều xảy ra là mặc dù tôi chỉ chuyển một tham chiếu đến dữ liệu của mình cho tất cả các tác vụ, khi các tác vụ được tuần tự hóa, dữ liệu sẽ được sao chép lặp đi lặp lại. Những gì tôi muốn làm là chia sẻ đối tượng trong số tất cả các nhiệm vụ. Đương nhiên, tôi có thể sửa đổi lớp như vậy:
// AbstractTask implements Serializable
public class Task extends AbstractTask
{
private static ReferenceToReallyBigObject object = null;
private final String filePath;
public Task(String filePath)
{
this.filePath = filePath;
}
public void run()
{
synchronized(this)
{
if(object == null)
{
ObjectReader reader = new ObjectReader(filePath);
object = reader.read();
}
}
// Do some stuff with the object (which is immutable).
}
}
Như bạn có thể thấy, ngay cả ở đây tôi có một vấn đề là việc chuyển một đường dẫn tệp khác có nghĩa là không có gì sau khi cái đầu tiên được thông qua. Đây là lý do tại sao tôi thích ý tưởng cho một cửa hàng đã được đăng trong câu trả lời. Dù sao, thay vì bao gồm logic để tải tệp trong phương thức chạy, tôi muốn trừu tượng hóa logic này thành một lớp Singleton. Tôi sẽ không cung cấp một ví dụ khác, nhưng tôi hy vọng bạn có ý tưởng. Xin vui lòng cho tôi nghe ý tưởng của bạn cho một cách thanh lịch hơn để thực hiện những gì tôi đang cố gắng làm. Cám ơn bạn một lần nữa!