আমি উইকিপিডিয়ায় সিঙ্গলটন নিবন্ধটি পড়ছিলাম এবং আমি এই উদাহরণটি পেয়েছিলাম:
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).
}
}
আপনি দেখতে পাচ্ছেন, এমনকি এখানে আমারও সমস্যা আছে যে একটি পৃথক ফাইল পাথ মানে প্রথম পাস করার পরে কিছুই হয় না। এই কারণেই আমি এমন একটি দোকানে উত্তর পছন্দ করি যা উত্তরে পোস্ট করা হয়েছিল। যাইহোক, রান পদ্ধতিতে ফাইলটি লোড করার জন্য যুক্তি যুক্ত করার পরিবর্তে, আমি এই যুক্তিটিকে একটি একক শ্রেণিতে বিমূর্ত করতে চেয়েছিলাম। আমি আর একটি উদাহরণ সরবরাহ করব না, তবে আমি আশা করি আপনি ধারণাটি পেয়ে গেছেন। আমি যা করতে চাইছি তা সম্পাদন করার জন্য দয়া করে আমাকে আরও মার্জিত উপায়ে আপনার ধারণাগুলি শুনতে দিন। আবার আপনাকে ধন্যবাদ!