একটি জেনেরিক টাইপ হলো এমন একটি জেনেরিক ক্লাস বা ইন্টারফেস, যা টাইপের ওপর প্যারামিটারাইজ করা থাকে। এর ফলে কম্পাইলার ক্লাস বা ইন্টারফেসের ওপর টাইপ সেফটি নিশ্চিত করতে পারে।
এই নন-জেনেরিক Container ইন্টারফেসটি দেখুন:
class Container {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
এটি যেহেতু Object টাইপ গ্রহণ করে এবং ফিরিয়ে দেয়, তাই যেকোনো নন-প্রিমিটিভ টাইপের সাথে এটি কাজ করে। কিন্তু এর একটি মূল্য দিতে হয়, কারণ কিছু কোড get কল করার সময় Integer আশা করতে পারে, আবার অন্য কোড set কল করে String যোগ করতে পারে, যার ফলে একটি রানটাইম এক্সসেপশন ঘটে।
একটি জেনেরিক ক্লাস ও একটি জেনেরিক ইন্টারফেস-এর রূপ নিচের মতো:
class ClassName<T1, T2, ..., Tn> { ... }
interface InterfaceName<T1, T2, ..., Tn> { ... }
ক্লাস বা ইন্টারফেসের নামের পরে অ্যাঙ্গেল ব্র্যাকেট (<>) দিয়ে ঘেরা টাইপ প্যারামিটার অংশটি টাইপ প্যারামিটারগুলোকে (যাদের টাইপ ভ্যারিয়েবলও বলা হয়) বোঝায়: T1, T2, ..., এবং Tn। এগুলো ক্লাস বা ইন্টারফেসের বডির ভেতরে ব্যবহার করে জেনেরিক টাইপ সেফটি পাওয়া যায়।
এখানে Container-এর জেনেরিক সংস্করণটি দেওয়া হলো:
class Container<E> {
private E object;
public void set(E object) { this.object = object; }
public E get() { return object; }
}
তৈরি করার সময় এখন আমাদের বলে দিতে হয় এটি কোন টাইপ ধারণ করবে, আর কম্পাইলার সেই শর্ত প্রয়োগ করে মানিয়ে নেয়:
// empty <> can infer from context
Container<String> stringContainer = new Container<>();
// compiler knows this is a String, so it is allowed
stringContainer.set("Some string");
// no cast needed, compiler knows it is a String
String result = stringContainer.get();
// this causes a compiler error:
stringContainer.set(42);
লিস্ট হলো Java-এর ক্রমানুসারে সাজানো সিকোয়েন্স কালেকশন। অ্যারের মতো নয়, একটি List যেকোনো সংখ্যক আইটেম ধারণ করার জন্য আকারে বাড়তে পারে। একটি আদর্শ ইমপ্লিমেন্টেশন হলো ArrayList, যা একটি আকার পরিবর্তনযোগ্য অ্যারের ওপর ভিত্তি করে তৈরি। আরেকটি আদর্শ ইমপ্লিমেন্টেশন হলো LinkedList ক্লাস, যা একটি ডাবলি-লিংকড লিস্টের ওপর ভিত্তি করে তৈরি।
List খালি থাকতে পারে, আবার যেকোনো সংখ্যক আইটেম ধারণ করতে পারে (ডুপ্লিকেটসহ)। List হলো একটি জেনেরিক ইন্টারফেস, যা টাইপ করা থাকে যাতে বোঝা যায় এটি কোন ধরনের অবজেক্ট ধারণ করতে পারে। যেমন:
List<String> emptyListOfStrings = List.of();
List<Integer> singleInteger = List.of(1);
List<Boolean> threeBooleans = List.of(true, false, true);
List<Object> listWithMultipleTypes = List.of("hello", 1, true);
List-এ এলিমেন্ট যোগ করা, সরানো, পাওয়া এবং কোনো এলিমেন্ট আছে কিনা তা যাচাই করার জন্য নানা রকম সহায়ক মেথড রয়েছে:
List<Character> vowels = new ArrayList<>(List.of('a', 'e', 'i', 'o', 'i', 'e', 'a'));
int startingSize = vowels.size(); // 7
vowels.add('u'); // vowels is now ['a', 'e', 'i', 'o', 'i', 'e', 'a', 'u']
char a = vowels.get(0); // 'a'
boolean hadI = vowels.remove('i'); // true and vowels is now ['a', 'e', 'o', 'i', 'e', 'a', 'u']
boolean hasI = vowels.contains('i'); // true (still have one more left)
কার্ল Exercism-এর ওয়েবসাইটে শেখার জন্য ভাষার একটি তালিকার হিসাব রাখতে চায়। কার্লের নতুন ভাষা যোগ করতে, পুরোনো ভাষা মুছে ফেলতে এবং নির্দিষ্ট কিছু ভাষা তালিকায় আছে কি না তা যাচাই করতে পারা দরকার। কার্ল যদি Java বা Kotlin শিখতে চায়, তাহলে সেটা হবে খুবই দারুণ ব্যাপার!
কার্লের জানা দরকার তার ভাষার তালিকা কখনো খালি হয়ে যায় কি না, যাতে সে শেখার জন্য আরও ভাষা খুঁজে বের করতে পারে!
isEmpty নামে একটি মেথড ডিফাইন করুন, যা তালিকায় কোনো ভাষা না থাকলে true রিটার্ন করে।
if (languageList.isEmpty()) {
findMoreLanguagesToLearn();
}
কার্ল Kotlin আর Python শেখার জন্য খুব উৎসাহ নিয়ে অপেক্ষা করছে!
addLanguage নামে একটি মেথড ডিফাইন করে কার্লকে শুরু করতে সাহায্য করুন, যা সে যে ভাষাটি শিখতে চায় সেটি নেয় এবং তালিকায় যোগ করে।
languageList.addLanguage("Kotlin");
languageList.addLanguage("Python");
কার্ল ঠিক করেছে, সে এখন Scala শিখতে চায় না।
removeLanguage নামে একটি মেথড ডিফাইন করে কার্লকে সেটি তালিকা থেকে মুছে ফেলতে সাহায্য করুন, যা সে যে ভাষাটি মুছে ফেলছে সেটি নেয় এবং তালিকা থেকে মুছে ফেলে।
languageList.removeLanguage("Scala");
কার্ল তার তালিকায় যোগ করা প্রথম ভাষাটি (যেটি এখনো তালিকায় আছে) মনে রাখতে চায়।
firstLanguage নামে একটি মেথড ডিফাইন করুন, যা তালিকার প্রথম ভাষাটি রিটার্ন করে।
String kotlin = languageList.firstLanguage(); // "Kotlin"
কার্লের জানা দরকার, সে কতটি ভাষা শেখার চেষ্টা করছে।
count নামে একটি মেথড ডিফাইন করে কার্লকে উত্তরটি খুঁজে পেতে সাহায্য করুন, যা তালিকার ভাষার সংখ্যা রিটার্ন করে।
int two = languageList.count(); // 2
কার্ল মনে করার চেষ্টা করছে, সে Python না Ruby শিখতে চেয়েছিল।
containsLanguage নামে একটি মেথড ডিফাইন করুন, যা সে যে ভাষাটি সম্পর্কে জানতে চায় সেটি নেয়, যাতে কার্ল তা জানতে পারে!
boolean learningPython = languageList.containsLanguage("Python"); // true
boolean learningRuby = languageList.containsLanguage("Ruby"); // false
কার্ল যদি Java বা Kotlin শিখতে চায়, তাহলে সেটা খুবই উত্তেজনাকর ব্যাপার!
isExciting নামে একটি মেথড ডিফাইন করুন, যা কার্ল Java বা Kotlin শিখতে চাইলে true রিটার্ন করে।
javaLanguageList.isExciting() // true
neitherKotlinNorJavaLanguageList.isExciting() // false
Exercism-এ সাইন আপ করুন, Java ট্র্যাকের 26টি কনসেপ্ট158টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।