Saya sedang membaca artikel Singleton di Wikipedia dan saya menemukan contoh ini:
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;
}
}
Walaupun saya sangat menyukai cara Singleton ini berperilaku, saya tidak dapat melihat bagaimana mengadaptasinya untuk memasukkan argumen ke konstruktor. Apa cara yang disukai untuk melakukan ini di Jawa? Apakah saya harus melakukan sesuatu seperti ini?
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;
}
}
Terima kasih!
Sunting: Saya pikir saya telah memulai badai kontroversi dengan keinginan saya untuk menggunakan Singleton. Biarkan saya menjelaskan motivasi saya dan semoga seseorang dapat menyarankan ide yang lebih baik. Saya menggunakan kerangka kerja komputasi grid untuk menjalankan tugas secara paralel. Secara umum, saya memiliki sesuatu seperti ini:
// 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).
}
}
Apa yang terjadi adalah bahwa meskipun saya hanya meneruskan referensi ke data saya ke semua tugas, ketika tugas-tugas bersambung, data akan disalin berulang-ulang. Yang ingin saya lakukan adalah membagikan objek di antara semua tugas. Secara alami, saya dapat memodifikasi kelas seperti:
// 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).
}
}
Seperti yang Anda lihat, bahkan di sini saya memiliki masalah bahwa melewati jalur file yang berbeda tidak ada artinya setelah yang pertama dilewati. Inilah sebabnya saya menyukai ide untuk toko yang diposting dalam jawaban. Bagaimanapun, daripada memasukkan logika untuk memuat file dalam metode run, saya ingin abstrak logika ini menjadi kelas Singleton. Saya tidak akan memberikan contoh lain, tetapi saya harap Anda mendapatkan idenya. Tolong biarkan saya mendengar ide Anda untuk cara yang lebih elegan untuk mencapai apa yang saya coba lakukan. Terima kasih lagi!