SORU
26 HAZİRAN 2009, Cuma


Singleton Java Argümanları ile

Wikipedia Singleton makale okuyordum ve bu örnek geldi:

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;
    }
}

Gerçekten bu Tek hareket şekli gibi olsa da, oluşturucu bağımsız değişkenleri birleştirmek için nasıl adapte göremiyorum. Java'da bunu yapmak için tercih edilen yolu nedir? Böyle bir şey yapmak zorunda mıydım?

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!

< / ^ hr .

Edit: Singleton kullanmak için benim arzu ile tartışma fırtınası başladı sanırım. Beni motive açıklayacağım ve umarım birisi daha iyi bir fikir önerebilirsiniz. Grid hesaplama çerçeve paralel görevleri yürütmek için kullanıyorum. Genel olarak, bu gibi 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 ben sadece görevleri sıralanmış zaman tüm görevler, benim veri için bir referans geçmesine rağmen, veri ve üzerinde kopyalanır alır. Yapmak istediğim şey bu görevleri arasında nesne paylaşımı. Doğal olarak, sınıf gibi değiştirin olabilir:

// 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 yol ilk sonra bir anlamı yok farklı bir dosya geçen geçirilen sorun var. Bu fikri seviyorummağazacevaplar yılında yayınlanmıştır. Her neyse, çalışma yöntemini dosya yükleme mantığı da dahil olmak üzere yerine, Tek bir sınıf içine bu mantık, soyut istedim. Bir başka örnek vermek istemiyorum ama siz anladınız umarım. Bana daha şık yapmaya çalışıyorum ne yapmak için bir yol için sizin fikirlerinizi duyalım lütfen. Tekrar teşekkür ederim!

CEVAP
26 HAZİRAN 2009, Cuma


Benim açımdan çok açık bir şekilde anlatacağım:parametreleri ile tek bir singleton.

Bir singleton, tanımı gereği, bir yerde daha örneği bir nesnedir. Eğer kurucu parametreleri beslemek için çalışıyorsanız, tek amacı nedir?

İki seçeneğiniz vardır. Eğer singleton bazı veri ile başlatılan istiyorsanız, veri ile yük olabilirörnekleme sonrayani: gibi

SingletonObj singleton = SingletonObj.getInstance();
singleton.init(paramA, paramB); // init the object with data

Eğer singleton gerçekleştirdiği operasyon yinelenen ve farklı parametreler ile her zaman ise, ana yöntem yürütülmekte olan parametreleri aktarmak olabilir:

SingletonObj singleton = SingletonObj.getInstance();
singleton.doSomething(paramA, paramB); // pass parameters on execution

Her durumda, örnekleme her zaman parametre-daha az olacaktır. Aksi takdirde tek bir singleton.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Developers

    Android Deve

    9 Kasım 2007
  • BDGcustoms

    BDGcustoms

    24 NİSAN 2011
  • Titan Lee Hai

    Titan Lee Ha

    14 Temmuz 2008