Wikipedia'daki Singleton makalesini okuyordum ve bu örnekle karşılaştım:
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;
}
}
Bu Singleton'un davranış tarzını gerçekten sevmeme rağmen, bunu yapıcıya argümanları dahil etmek için nasıl uyarlayacağımı göremiyorum. Java ile bunu yapmanın tercih edilen yolu nedir? Böyle bir şey yapmam gerekir mi?
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;
}
}
Teşekkürler!
Edit: Sanırım Singleton kullanma arzumla bir tartışma fırtınası başlattım. Motivasyonumu açıklayayım ve umarım birisi daha iyi bir fikir önerebilir. Paralel görevleri yürütmek için bir ızgara bilgi işlem çerçevesi kullanıyorum. Genel olarak, böyle bir şey var:
// 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).
}
}
Ne olur ki, tüm görevlere sadece verilerime bir referans göndermeme rağmen, görevler seri hale getirildiğinde, veriler tekrar tekrar kopyalanır. Yapmak istediğim, nesneyi tüm görevler arasında paylaşmak. Doğal olarak, sınıfı şöyle değiştirebilirim:
// 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).
}
}
Gördüğünüz gibi, burada bile, farklı bir dosya yolundan geçmenin, ilk dosya geçildikten sonra hiçbir şey ifade etmediği sorunu var. Bu yüzden cevaplarda yayınlanan bir mağaza fikrini seviyorum . Her neyse, dosyayı run yöntemine yüklemek için mantığı eklemek yerine, bu mantığı bir Singleton sınıfına soyutlamak istedim. Başka bir örnek vermeyeceğim, ama umarım bu fikri anlarsınız. Lütfen yapmaya çalıştığım şeyi başarmanın daha zarif bir yolu için fikirlerinizi duymama izin verin. Tekrar teşekkürler!