এনাম সিঙ্গলেটনের কিছু সমস্যা:
একটি বাস্তবায়ন কৌশল প্রতিশ্রুতিবদ্ধ
সাধারণত, "সিঙ্গেলটন" একটি প্রয়োগের কৌশল বোঝায়, কোনও এপিআই স্পেসিফিকেশন নয়। Foo1.getInstance()
সর্বজনীনভাবে ঘোষণা করা খুব বিরল যে এটি সর্বদা একই উদাহরণটি ফিরে আসবে। যদি প্রয়োজন হয় তবে প্রয়োগটি Foo1.getInstance()
বিবর্তিত হতে পারে, উদাহরণস্বরূপ, প্রতিটি থ্রেডে একটি উদাহরণ ফেরত দেওয়া।
সঙ্গে Foo2.INSTANCE
আমরা সর্বজনীনভাবে ঘোষণা করছি যে এই ক্ষেত্রটিকেই হয় উদাহরণস্বরূপ, এবং যে পরিবর্তনের কোনো সুযোগ। একক উদাহরণ থাকার বাস্তবায়ন কৌশল উন্মুক্ত এবং প্রতিশ্রুতিবদ্ধ।
এই সমস্যাটি পঙ্গু নয়। উদাহরণস্বরূপ, কার্যকরভাবে প্রতি-থ্রেড দৃষ্টান্তটি Foo2.INSTANCE.doo()
রাখতে থ্রেড স্থানীয় সহায়ক সহায়িকার উপর নির্ভর করতে পারে ।
এনাম ক্লাস বাড়ানো হচ্ছে
Foo2
একটি সুপার ক্লাস প্রসারিত Enum<Foo2>
। আমরা সাধারণত সুপার ক্লাস এড়াতে চাই; বিশেষত এক্ষেত্রে, সুপার ক্লাসটি জোর করা Foo2
হওয়ার সাথে কিছুই করার নেই Foo2
। এটি আমাদের অ্যাপ্লিকেশনটির ধরণের শ্রেণিবিন্যাসের দূষণ। আমরা যদি সত্যিই একটি সুপার ক্লাস চাই, সাধারণত এটি একটি অ্যাপ্লিকেশন শ্রেণি, তবে আমরা পারি না, Foo2
এর সুপার ক্লাসটি স্থির।
Foo2
কিছু মজাদার উদাহরণ পদ্ধতি উত্তরাধিকার সূত্রে প্রাপ্ত name(), cardinal(), compareTo(Foo2)
, যা কেবলমাত্র Foo2
ব্যবহারকারীদের জন্য বিভ্রান্তিকর । এমনকি যদি এর পদ্ধতিটি ইন্টারফেসে পছন্দসই হয় তবে Foo2
তার নিজস্ব name()
পদ্ধতি থাকতে পারে না Foo2
।
Foo2
এছাড়াও কিছু মজার স্থির পদ্ধতি রয়েছে
public static Foo2[] values() { ... }
public static Foo2 valueOf(String name) { ... }
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
যা ব্যবহারকারীদের কাছে অযৌক্তিক বলে মনে হচ্ছে। একটি সিঙ্গলটনের সাধারণত পালবিক স্ট্যাটিক পদ্ধতি থাকা উচিত নয় (বাদে getInstance()
)
Serializability
সিলেটলেটদের স্টেটফুল হওয়া খুব সাধারণ বিষয়। এই সিলেটলেটগুলি সাধারণত সিরিয়ালযোগ্য হওয়া উচিত নয় । আমি কোনও বাস্তববাদী উদাহরণের কথা ভাবতে পারি না যেখানে রাষ্ট্রীয় সিঙ্গলটনকে একটি ভিএম থেকে অন্য ভিএম-তে পরিবহন করা বোধগম্য হয়; একটি সিঙ্গেলনের অর্থ "এক ভিএম এর মধ্যে অনন্য", "মহাবিশ্বের অনন্য" নয়।
যদি সিরিয়ালাইজেশন সত্যই রাষ্ট্রীয় সিঙ্গলটনের জন্য অর্থবোধ করে, তবে সিঙ্গলটনের স্পষ্টভাবে এবং সুনির্দিষ্টভাবে উল্লেখ করতে হবে যে অন্য ভিএম-তে যেখানে একই ধরণের সিঙ্গলটন ইতিমধ্যে বিদ্যমান থাকতে পারে সেখানে সিঙ্গেলটনকে ডিসরিয়ালাইজ করার অর্থ কী does
Foo2
স্বয়ংক্রিয়ভাবে একটি সরলিক সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন কৌশল প্রতিশ্রুতিবদ্ধ। এটি ঘটে যাওয়ার অপেক্ষায় কেবল দুর্ঘটনা। আমাদের কাছে যদি ডেটা ট্রি থাকে ধারণামূলকভাবে Foo2
ভিএম 1- এর স্থিতিগত ভেরিয়েবলকে টি 1 এ উল্লেখ করা হয়, সিরিয়ালাইজেশন / ডেসারিয়ালাইজেশনের মাধ্যমে মানটি আলাদা মান হয়ে যায় - Foo2
টিএম-তে ভিএম 2 এর একই ভেরিয়েবলের মান, বাগ সনাক্ত করার জন্য একটি হার্ড তৈরি করে। এই বাগটি Foo1
নিঃশব্দে অনির্বাচনযোগ্যতে ঘটবে না ।
কোডিংয়ের সীমাবদ্ধতা
এমন কিছু জিনিস রয়েছে যা সাধারণ ক্লাসে করা যায় তবে enum
ক্লাসে নিষিদ্ধ । উদাহরণস্বরূপ, কনস্ট্রাক্টরে স্থির ক্ষেত্র অ্যাক্সেস করা। প্রোগ্রামারটি যেহেতু তিনি একটি বিশেষ শ্রেণিতে কাজ করছেন সেহেতু আরও যত্নবান হতে হবে।
উপসংহার
এনগমে পিগিগ্যাকিংয়ের মাধ্যমে আমরা 2 টি লাইনের কোড সংরক্ষণ করি; তবে দামটি খুব বেশি, এনামগুলির সমস্ত ব্যাগেজ এবং বিধিনিষেধ আমাদের বহন করতে হবে, আমরা অজান্তেই এনামের "বৈশিষ্ট্যগুলি" পেয়েছি যার অনিচ্ছাকৃত পরিণতি রয়েছে। একমাত্র কথিত সুবিধা - স্বয়ংক্রিয় সিরিয়ালাইজিবিলিটি - এটি একটি অসুবিধে পরিণত হয়েছে।