मैं विकिपीडिया पर सिंगलटन लेख पढ़ रहा था और मैं इस उदाहरण पर आया:
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;
}
}
जबकि मैं वास्तव में जिस तरह से इस सिंगलटन का व्यवहार करता हूं, मैं यह नहीं देख सकता कि इसे कंस्ट्रक्टर को तर्कों को शामिल करने के लिए कैसे अनुकूलित किया जाए। जावा में ऐसा करने का पसंदीदा तरीका क्या है? क्या मुझे ऐसा कुछ करना होगा?
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;
}
}
धन्यवाद!
संपादित करें: मुझे लगता है कि मैंने सिंगलटन का उपयोग करने की इच्छा के साथ विवाद की आंधी शुरू कर दी है। मुझे अपनी प्रेरणा समझाएं और उम्मीद है कि कोई बेहतर विचार सुझा सकता है। मैं समानांतर में कार्यों को निष्पादित करने के लिए एक ग्रिड कंप्यूटिंग ढांचे का उपयोग कर रहा हूं। सामान्य तौर पर, मेरे पास ऐसा कुछ है:
// 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).
}
}
क्या होता है कि भले ही मैं केवल अपने डेटा के सभी कार्यों के लिए एक संदर्भ देता हूं, जब कार्यों को क्रमबद्ध किया जाता है, तो डेटा को बार-बार कॉपी किया जाता है। मैं जो करना चाहता हूं वह सभी कार्यों के बीच वस्तु को साझा करना है। स्वाभाविक रूप से, मैं कक्षा को इस तरह संशोधित कर सकता हूं:
// 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).
}
}
जैसा कि आप देख सकते हैं, यहां तक कि मेरे पास यह मुद्दा है कि एक अलग फ़ाइल पथ से गुजरने का मतलब पहले पारित होने के बाद कुछ भी नहीं है। यही कारण है कि मुझे एक स्टोर के लिए विचार पसंद है जो जवाबों में पोस्ट किया गया था। किसी भी तरह, रन विधि में फ़ाइल लोड करने के लिए तर्क को शामिल करने के बजाय, मैं इस तर्क को एक सिंगलटन वर्ग में सार करना चाहता था। मैं अभी तक एक और उदाहरण प्रदान नहीं करूंगा, लेकिन मुझे आशा है कि आपको यह विचार मिलेगा। कृपया मुझे अपने विचारों को सुनने के लिए और अधिक सुरुचिपूर्ण तरीके से पूरा करने के लिए जो मैं करने की कोशिश कर रहा हूं। फिर से धन्यवाद!