জাভা লোকাল টাইপ ইনফারেন্স
জাভাতে কোনো ভ্যারিয়েবল ডিক্লেয়ার করতে হলে দুইবার টাইপ লিখতে হয়। যেমন-
ArrayList<String> list = new ArrayList<>();
ওপরের এই লাইনে দুইবার ArrayList লিখতে হয়েছে। এটি অনেক সশয় প্রয়োজনাতিরিক্ত ব্যবহার মনে হতে পারে। একপাশে টাইপ ইনফরমেশন থাকলেই আধুনিক কম্পাইলারের তা বুঝে ফেলা উচিৎ। জাভা ১০-এ জাভা কম্পাইলারের এই টাইপ বুঝে ফেলার ফিচারটি সংযুক্ত করা হয়। এর ফলে ভ্যারিয়েবল ডিক্লেয়ার করার সময় বা পাশে var কিওয়ার্ড ব্যবহার করা যায়। উদাহরণ-
var list = new ArrayList<String>();
ওপরের এই কোডে বা পাশের list যে একটি অ্যারেলিস্টের ভ্যারিয়েবল তা জাভা কম্পাইলার বুঝতে পারে। এভাবে কম্পাইলারের ভ্যারিয়েবলের টাইপ অটোম্যাটিক্যালি বুঝে ফেলার ক্ষমতাকে টাইপ ইনফারেন্স বলে।
তবে জাভাতে এই ফিচারটির একটি সীমাবদ্ধতা রয়েছে। এটি শুধুমাত্র লোকাল ভ্যারিয়েবলের ক্ষেত্রে ব্যবহার করা যায়। এটি ফিল্ড বা মেথডের প্যারামিটার হিসেবে ব্যবহার করা যায় না।
public void doSomething(var x){
}
ওপরের এই মেথডটি বৈধ নয়।
এটি যেহেতু শুধুমাত্র লোকাল ভ্যারিয়েবলের ক্ষেত্রে ব্যবহার করা যায়, তাই এই ফিচারটির নাম লোকাল টাইপ ইনফারেন্স। এটি ব্যবহারের ফলে কোড আরও সুন্দর ও গোছানো দেখায়। উদাহরণ -
var path = Paths.get(fileName);
var bytes = Files.readAllBytes(path);
var list = new ArrayList<String>();
var stream = list.stream();
এছাড়া মেথড কল করে ভ্যারিয়েবলে অ্যাসাইন করার সময়ও var ব্যবহার করা যায়।
private Map<BookGenres, Map<Rating, List<Book>>> getBookGenresMap(List<Book> books) {
return books.stream()
.collect(groupingBy(Book::getBookGenres,
groupingBy(this::getRating)));
}
ওপরের মেথডটি কল করে ভ্যারিয়েবলে অ্যাসাইন করতে হলে নিচের মতো লিখতে হবে-
Map<BookGenres, Map<Rating, List<Book>>> groupByRatingAndGenres =
getBookGenresMap(books);
ওপরের অ্যাসাইনমেন্টটি বেশ বড়। একে var ব্যবহার করে সংক্ষিপ্ত করা যায়—
var groupByRatingAndGenres = getBookGenresMap(books);
এছাড়া ফর লুপ ও এনহ্যান্সড ফর লুপেও var ব্যবহার করা যায়। উদাহরণ-
List<Book> books = createBooks();
for (var book : books) {
}
for (var i = 0; i < books.size(); i++) {
}
এখানে লক্ষ্যণীয় যে, লোকাল টাইপ ইনফারেন্স ডানপাশের টাইপের ওপর নির্ভর করে বা পাশের ভ্যারিয়েবলের টাইপ নির্ধারণ করে। এ জন্য নিচের এই স্টেটমেন্টটি বৈধ নয়।
var name ;
var ব্যবহারের জন্য ভ্যারিয়েবলকে অবশ্যই ইনিশিয়ালাইজ করতে হবে। যেমন-
var name = "Bazlur";
var num = 1;
একই কারণে ল্যামডা এক্সপ্রেশনকে ভ্যারিয়েবলে অ্যাসাইন করতে var ব্যবহার করা যায় না। কারণ একই ল্যামডা এক্সপ্রেশনের একাধিক টার্গেট টাইপ থাকতে পারে। ল্যামডা এক্সপ্রেশনের ভ্যারিয়েবলে var ব্যবহার করলে কম্পাইলার এর টার্গেট টাইপ নির্ধারণ করতে পারে না।
var startsWith = value -> value.startsWith("A");
ওপরের লাইনটি বৈধ নয়।
লোকাল টাইপ ইনফারেন্স জাভা কোডকে সংক্ষিপ্ত করলে এ নিয়ে কিছুটা বিতর্কও রয়েছে। অনেকেই এই ফিচারটিকে স্বাগত জানালেও অনেকে মনে করছে যেহেতু var ব্যবহারের ফলে ভ্যারিয়েবলের বা-পাশে টাইপ ইনফরমেশন থাকছে না তাই এটি কোডের পাঠযোগ্যতা কিছুটা কমিয়ে দিচ্ছে। দুই দলই এখানে সঠিক। ভ্যারিয়েলের দুই পাশেই টাইপ ইনফরমেশন না রেখে এক পাশে রাখলে কোড সংক্ষিপ্ত হয় ও সুন্দর হয়। এতে কোড আরও বেশি পাঠযোগ্য করা যায়। তবে এর বিপরিত ঘটনাটিও সম্ভব। ভ্যারিয়েবলের সঙ্গে টাইপ ইনফরেশন না থাকার ফলে কোড পড়ার সময় বুঝতে অসুবিধা হতে পারে।
এই বিষয়ে আরও বিস্তারিত পড়তে হলে, আমার অ্যাডভান্স জাভা প্রোগ্রামিং বইটি সংগ্রহ করতে পারেন।