java - Enum সঙ্গে একক্টন বাস্তবায়ন(জাভা মধ্যে)




design-patterns enums (4)

আমি পড়তে পেরেছি যে Singleton ব্যবহার করে জাভাতে Singleton বাস্তবায়ন করা সম্ভব:

public enum MySingleton {
     INSTANCE;   
}

কিন্তু, উপরে কাজ কিভাবে? বিশেষত, একটি Object তাত্ক্ষনিক করা আছে। এখানে, MySingleton কীভাবে তাত্ক্ষণিক হয়? কে new MySingleton() করছেন?


এই,

public enum MySingleton {
  INSTANCE;   
}

একটি নিখুঁত খালি গঠনকারী আছে। এর পরিবর্তে স্পষ্ট হতে,

public enum MySingleton {
    INSTANCE;
    private MySingleton() {
        System.out.println("Here");
    }
}

যদি আপনি তারপর একটি main() পদ্ধতির মত অন্য ক্লাস যোগ করেছেন

public static void main(String[] args) {
    System.out.println(MySingleton.INSTANCE);
}

আপনি দেখতে হবে

Here
INSTANCE

enum ক্ষেত্র কম্পাইল সময় enum হয়, কিন্তু তারা তাদের enum টাইপ উদাহরণ। এবং, যখন তারা প্রথমবার enum টাইপ উল্লেখ করা হয়, তারা নির্মিত হয়।


একটি enum টাইপ একটি বিশেষ ধরনের class টাইপ।

আপনার enum ঘোষণা আসলে মত কিছু কম্পাইল

public final class MySingleton {
    public final static MySingleton INSTANCE = new MySingleton();
    private MySingleton(){} 
}

যখন আপনার কোড প্রথমে INSTANCE অ্যাক্সেস করে, তখন ক্লাস MySingleton লোড হবে এবং JVM দ্বারা শুরু হবে। এই প্রক্রিয়া static ক্ষেত্র একবার (আড়ম্বরপূর্ণ) আরম্ভ করে।


যেমন, কিছুটা আগে উল্লেখ করা হয়েছে, একটি enum একটি জাভা শ্রেণী বিশেষ শর্ত সঙ্গে যে তার সংজ্ঞা অন্তত একটি "enum ধ্রুবক" দিয়ে শুরু করা আবশ্যক।

তার থেকে অংশ, এটি কোনও শ্রেণির মতো শ্রেণি এবং আপনি ধ্রুবক সংজ্ঞাগুলির নীচে পদ্ধতিগুলি যোগ করে এটি ব্যবহার করেন:

public enum MySingleton {
    INSTANCE;

    public void doSomething() { ... }

    public synchronized String getSomething() { return something; }

    private String something;
}

আপনি এই লাইন বরাবর একক্টন এর পদ্ধতি অ্যাক্সেস:

MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();

অন্যতম উত্তর হিসেবে উল্লিখিত এনমের ব্যবহারটি অন্য উত্তরগুলির মধ্যে উল্লেখ করা হয়েছে, প্রায়শই সিঙ্গল্টের একটি থ্রেড-নিরাপদ তাত্ক্ষণিকতা এবং একটি গ্যারান্টি যে এটি কেবলমাত্র একটি কপি থাকবে।

এবং, সম্ভবত, সবচেয়ে গুরুত্বপূর্ণভাবে, এই আচরণটি JVM নিজেই এবং জাভা স্পেসিফিকেশন দ্বারা নিশ্চিত।

এখানে একটি জিন স্পেসিফিকেশন থেকে একটি বিভাগ যা একটি enum উদাহরণের একাধিক দৃষ্টান্ত প্রতিরোধ করা হয়েছে:

একটি enum টাইপ তার enum constants দ্বারা সংজ্ঞায়িত ছাড়া অন্য কোন দৃষ্টান্ত আছে। এটি একটি কম্পাইল-টাইম ত্রুটি যা স্পষ্টভাবে একটি enum টাইপকে তাত্ক্ষণিক করার চেষ্টা করে। Enum মধ্যে চূড়ান্ত ক্লোন পদ্ধতি নিশ্চিত করে যে enum স্টোনট্যান্ট ক্লোন করা যাবে না, এবং সিরিয়ালাইজেশন প্রক্রিয়া দ্বারা বিশেষ চিকিত্সা নিশ্চিত করে যে deserialization ফলে সদৃশ দৃষ্টান্ত কখনও তৈরি করা হয়। Enum ধরনের প্রতিফলিত তাত্পর্য নিষিদ্ধ করা হয়। একসঙ্গে, এই চারটি জিনিসগুলি নিশ্চিত করে যে এনম স্টোনেন্টগুলির দ্বারা সংজ্ঞায়িত কোনও এননাম টাইপের কোনও উদাহরণ নেই।

উল্লেখ্য যে তাত্ক্ষণিকতার পরে যেকোনো থ্রেড নিরাপত্তা উদ্বেগগুলিকে সিঙ্ক্রোনাইজড কীওয়ার্ড সহ অন্য কোনও শ্রেণির মতো পরিচালিত করতে হবে।


যেহেতু সিঙ্গলটন প্যাটার্নটি একটি ব্যক্তিগত কনস্ট্রাকটর থাকার এবং তাত্ক্ষণিকভাবে নিয়ন্ত্রণের জন্য কিছু পদ্ধতি কল করার (যেমন কিছু getInstance ), Enums এ ইতিমধ্যে আমাদের একটি প্রাইভেট কনস্ট্রাক্টর রয়েছে।

আমি ঠিক জানি না কিভাবে JVM বা কিছু কন্টেইনার আমাদের Enums এর দৃষ্টান্তগুলি নিয়ন্ত্রণ করে, কিন্তু মনে হচ্ছে এটি ইতিমধ্যে একটি অন্তর্নির্মিত Singleton Pattern ব্যবহার করে, পার্থক্য হল আমরা একটি getInstance কল করি না, আমরা শুধু Enum কল করি।





singleton