আপনি সম্প্রতি সিঙ্গেলটন ডিজাইন প্যাটার্ন , কীভাবে এটি জাভাতে প্রয়োগ করবেন এবং এটি কিসের জন্য তা জেনেছেন। কিন্তু যদি আমি আপনাকে বলি যে জাভা বাক্সের বাইরে তার নিজস্ব এককটন নিয়ে আসে? কৌতূহলী? তাহলে এর মধ্যে ডুব দেওয়া যাক.

আপনি সম্ভবত ইতিমধ্যেই Enum ক্লাস সম্পর্কে জানেন । এটির একটি বিশেষ বৈশিষ্ট্য রয়েছে যা আপনার সচেতন হওয়া উচিত। বিশেষত, Enum সিঙ্গলটন ডিজাইন প্যাটার্ন প্রয়োগ করে। এই বিকল্পটি একটি পাবলিক ক্ষেত্র জড়িত সিঙ্গলটন পদ্ধতির প্রায় একই ।

এনাম হিসাবে সিঙ্গেলটন:


public enum Device {   
    PRINTER	
} 
    

একটি পাবলিক পরিবর্তনশীল হিসাবে Singleton:


public class Printer {   
    public static final Printer PRINTER = new Printer();   
    private Printer() {
    }
//…
}
    

এনাম পদ্ধতিটি পাবলিক-ফিল্ড পদ্ধতির চেয়ে আরও কমপ্যাক্ট, যেহেতু আমাদের নিজস্ব বাস্তবায়ন লিখতে হবে না। সবচেয়ে গুরুত্বপূর্ণ, ক্রমানুসারে enums এর কোন সমস্যা নেই।

enums এর ক্রমিকীকরণ সাধারণ বস্তুর তুলনায় ভিন্নভাবে কাজ করে: শুধুমাত্র enum নামের মান ক্রমিক করা হয়। ডিসিরিয়ালাইজেশনের সময়, একটি উদাহরণ পেতে পদ্ধতিটি ডিসিরিয়ালাইজড নামের সাথে ব্যবহার করা হয়। উপরন্তু, enum আপনাকে প্রতিফলন আক্রমণ থেকে রক্ষা করতে পারে ।

আপনি দ্বিতীয় মডিউলের পাঠগুলিতে প্রতিফলন সম্পর্কে আরও শিখবেন, যেখানে আমরা প্রতিফলন API অন্বেষণ করব ।

জাভা ইনস্ট্যান্টিয়েটিং এনামকে নিষিদ্ধ করে — কনস্ট্রাক্টর ক্লাসের নতুন ইনস্ট্যান্স পদ্ধতির বাস্তবায়নে বেক করা একটি সীমাবদ্ধতা , যা প্রতিফলনের মাধ্যমে বস্তু তৈরি করার সময় বলা হয়।

Constructor.newInstance থেকে কোডের উদ্ধৃতি একটি enum তৈরি করতে ব্যবহৃত হয় :


if ((clazz.getModifiers() & Modifier.ENUM) != 0)
    throw new IllegalArgumentException("Cannot reflectively create enum objects");
    

একটি সিঙ্গলটন তৈরি করতে একটি enum ব্যবহার করার অসুবিধাগুলির মধ্যে রয়েছে:

  • অলস প্রারম্ভিকতার অভাব, যেহেতু বস্তুটি অবিলম্বে তৈরি করা হয় এবং আরম্ভে বিলম্ব করা যায় না।

  • অন্য ক্লাস বাড়ানো যাবে না। অর্থাৎ, এমন ক্ষেত্রে যেখানে আপনাকে অন্য ক্লাসের উত্তরাধিকারী হতে হবে, এটি সিঙ্গলটন হিসাবে একটি enum ব্যবহার করা কাজ করবে না। এই ধরনের ক্ষেত্রে, আমাদের ইতিমধ্যে পরিচিত অন্যান্য বাস্তবায়ন বিকল্পগুলিতে যেতে হবে: একটি স্ট্যাটিক পদ্ধতি বা একটি পাবলিক পরিবর্তনশীল।

  • একটি সিঙ্গলটন হিসাবে enum ব্যবহার করার সময়, আপনি শুধুমাত্র একটি enum ক্ষেত্র ব্যবহার করতে পারেন।


public enum Device extends Electricity { 
    PRINTER 
}
    

এই কোডটি আমাদের একটি সংকলন ত্রুটি দেবে:

enum এর জন্য কোন প্রসারিত ধারা অনুমোদিত নয়

কিন্তু যদি আমাদের একটি ইন্টারফেস বাস্তবায়ন করতে হয়, তাহলে কোন সমস্যা নেই, যেহেতু enum ইন্টারফেসগুলি বাস্তবায়ন করতে পারে:


public enum Device implements Electricity { 
    PRINTER 
}
    

আপনার যদি উত্তরাধিকার ব্যবহার করার প্রয়োজন না হয়, তাহলে enum এর মাধ্যমে সিঙ্গেলটন প্যাটার্ন বাস্তবায়ন করা ভাল । আমরা একা এই সুপারিশ করি না — জোশুয়া ব্লচ নিজেও করেন

এই বাস্তবায়ন পদ্ধতি আপনাকে সুবিধা, কমপ্যাক্টনেস, বাক্সের বাইরে সিরিয়ালাইজেশন, প্রতিফলন আক্রমণ থেকে সুরক্ষা এবং স্বতন্ত্রতা দেয় — যা একজন ভালো সিঙ্গলটনের প্রয়োজন!