জাভা এনামগুলি দুর্দান্ত। জেনেরিকস হয়। টাইপ ইরেজরের কারণে অবশ্যই আমরা সকলে পরবর্তী সীমাবদ্ধতাগুলি জানি। তবে একটি জিনিস আছে যা আমি বুঝতে পারি না, কেন আমি এই জাতীয় এনাম তৈরি করতে পারি না:
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
পরিবর্তে এই জেনেরিক ধরণের পরামিতিটি <T>
বিভিন্ন স্থানে কার্যকর হতে পারে। কোনও পদ্ধতির জেনেরিক ধরণের পরামিতিটি কল্পনা করুন:
public <T> T getValue(MyEnum<T> param);
অথবা এমনকি এনাম শ্রেণিতেও:
public T convert(Object o);
আরও দৃ concrete় উদাহরণ # 1
যেহেতু উপরের উদাহরণটি কারও কারও কাছে বিমূর্ত মনে হতে পারে, কেন আমি এটি করতে চাই তার একটি আরও বাস্তব জীবনের উদাহরণ's এই উদাহরণে আমি ব্যবহার করতে চাই
- এনামস, কারণ তখন আমি সম্পত্তি কীগুলির একটি সীমাবদ্ধ সংখ্যা গণনা করতে পারি
- জেনারিক্স, কারণ তখন আমি সম্পত্তি রাখার জন্য পদ্ধতি-স্তরের টাইপ-সুরক্ষা পেতে পারি
public interface MyProperties {
public <T> void put(MyEnum<T> key, T value);
public <T> T get(MyEnum<T> key);
}
আরও দৃ concrete় উদাহরণ # 2
আমার কাছে ডেটা ধরণের একটি সংখ্যা রয়েছে:
public interface DataType<T> {}
public enum SQLDataType<T> implements DataType<T> {
TINYINT<Byte>,
SMALLINT<Short>,
INT<Integer>,
BIGINT<Long>,
CLOB<String>,
VARCHAR<String>,
...
}
প্রতিটি এনাম আক্ষরিক স্পষ্টতই জেনেরিক ধরণের উপর ভিত্তি করে অতিরিক্ত সম্পত্তি থাকবে <T>
, একই সময়ে, একটি এনাম (অপরিবর্তনীয়, সিঙ্গলটন, গণনাযোগ্য ইত্যাদি) হবে)
প্রশ্ন:
কেউ কি ভেবে দেখেনি? এটি কি সংকলক সম্পর্কিত সীমাবদ্ধতা? এই সত্যটি বিবেচনা করে, " এনাম " কীওয়ার্ডটি সিনট্যাকটিক চিনির হিসাবে প্রয়োগ করা হয়েছে, জেভিএমকে উত্পন্ন কোডের প্রতিনিধিত্ব করে, আমি এই সীমাবদ্ধতাটি বুঝতে পারি না।
কে আমাকে এই ব্যাখ্যা করতে পারে? উত্তর দেওয়ার আগে এটিকে বিবেচনা করুন:
- আমি জানি জেনেরিক প্রকারগুলি মুছে ফেলা হয় :-)
- আমি জানি ক্লাস অবজেক্ট ব্যবহার করে ওয়ার্কআউন্ডস রয়েছে। তারা কর্মক্ষেত্রের।
- জেনেরিক ধরণের ফলাফল প্রযোজ্য যেখানেই সংকলক-উত্পাদিত ধরণের কাস্টগুলিতে ঘটে (যেমন রূপান্তর () রূপে কল করার সময়)
- জেনেরিক টাইপ <T> এনামে থাকবে। সুতরাং এটি এনামের আক্ষরিক প্রতিটি দ্বারা আবদ্ধ। তাই সংকলকটি জানতে পারে, কোনও জাতীয় লেখার সময় কোন প্রকারটি প্রয়োগ করতে হবে
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
- একই
T getvalue()
পদ্ধতিতে জেনেরিক ধরণের পরামিতিগুলির ক্ষেত্রে প্রযোজ্য । সংকলক কল করার সময় টাইপ কাস্টিং প্রয়োগ করতে পারেString string = someClass.getValue(LITERAL1)
enum
জাভা 1.5 এর আগে আমরা ব্যবহার করেছি "টাইপসেফ এনাম" আইডিয়মে পরিণত করুন । হঠাৎ করে, আপনি আপনার এনাম সদস্যদের প্যারামিটারাইজ করতে পারেন। সম্ভবত আমি এখন এটি করতে যাচ্ছি।