#জাভা ৮, #ইন্টারফেস, #নতুন ফীচার, #ডিফল্ট মেথড, #স্ট্যাটিক মেথড
৩ অক্টোবর, সোমবার ২০১৬
আজকের লেখা খুব ছোট হবে। জাভা ৮ -এর ইন্টারফেস -এর একটা নতুন ফীচার নিয়ে শেখা আর্টিকেল শেয়ার করাই মূল উদ্দেশ্য।
তার আগে, জাভা নিয়ে একটা সাধারণ ভুল সম্পর্কে বলে নেই। জাভা ৮ বললেও আসলে তা ১.৮। জাভার কোনো ভার্সনে যখন কোনো বড় ধরণের পরিবর্তন আসে, তখন সবাই জাভাকে একটা নাম দিয়ে আলাদা করতে চায়। যেমন কেউ কখনো মনে হয় না জাভা ৩ বা জাভা ৪ -এর নাম শুনেছে। আমি অন্তত শুনি নাই। কারণ বড় কোনো ফিচার বা উন্নতি (improvement) জাভা ১.৩ বা ১.৪ - এ সম্ভবতঃ হয় নাই। জাভা ২ (আদতে ১.২) -এর পর জাভা ৫ (আবারো, আসলে ১.৫) -এর কথা শোনার পর এখন জাভা ৮ -এর কথা শুনছি।
যাই হোক, একটা উদাহরণ দিয়ে জাভা ৮-এর ইন্টারফেসের নতুন ফিচারটা ব্যাখ্যা করার চেষ্টা করি।
ধরা যাক, একটা ইন্টারফেস আছে MagicWand (বাংলায় জাদুর লাঠি), যার মধ্যে একটা মেথড সিগনেচার ডিক্লেয়ার করা আছে doMagic. দেখতে অনেকটা নিচের মতো:
public interface MagicWand
{
void doMagic();
}
ধরা যাক, এই ইন্টারফেসটা অনেক আগের লেখা, এবং অসংখ্য ক্লাস এটা ইমপ্লিমেন্ট করে বসে আছে। অনেক জাভা লাইব্রেরি লেখা হয়েছে গেছে এই ইন্টারফেস ইমপ্লিমেন্ট করে। এখন ইন্টারফেস -টার মালিকদের মনে হলো, আরেকটা খুব জোস্ মেথড সিগনেচার ইন্টারফেসটাতে যোগ করা দরকার, doAdvancedMagic() । এটা যোগ করে ইন্টারফেসটার চেহারা বদলিয়ে নিচের মতো করা দরকার:
public interface MagicWand
{
void doMagic();
// new method signature
void doAdvancedMagic();
}
এতে করে কী ঝামেলা হতে পারে বলুন তো? ঠিকই ধরেছেন, আগের ইন্টারফেস ইমপ্লিমেন্ট করা সবগুলো ক্লাস বা লাইব্রেরিগুলো ভেঙে পড়বে। কারণ, কোনো ক্লাসেরই এই নতুন মেথড ইমপ্লিমেন্ট করা নাই।
তাহলে কী করা?
একটা উপায় ছিল (ছিল বলছি কারণ, জাভা ৮-এর আগে এভাবেই সমস্যাটার সমাধান করতে হতো) - নতুন একটা ইন্টারফেস ডিক্লেয়ার করে আগেরটা ইনহেরিট করা, আর নতুনটায় নতুন মেথড যোগ করা।
জাভা ৮ -এ এখন ডিফল্ট মেথড (default method) ব্যবহার করে এর সমাধান করা যায়:
public interface MagicWand
{
void doMagic();
default void doAdvancedMagic() {
// ... some code here
}
}
খেয়াল করে দেখবেন, শুধু নতুন মেথড সিগনেচারই না, মেথডের ডিফল্ট কোডও যোগ করা যায়। নতুন সবগুলো ক্লাস যারা কিনা এই ইন্টারফেস ইমপ্লিমেন্ট করবে, তারা এই নতুন মেথড ব্যবহার করতে পারবে: চাইলে নিজেরা নিজেদের কোড ইমপ্লিমেন্ট করবে বা ওভাররাইড করবে, আর না করলে ডিফল্ট মেথডের কোড ব্যবহার করতে পারবে। আর আগের সব গুলো ক্লাস কোনো ঝামেলা ছাড়াই অর্থাৎ কোড ব্রেক বা ভেঙে পড়া ছাড়াই কাজ করবে। দারুন না ব্যাপারটা?!
আরেকটা নতুন ফিচার হলো, এখন ইন্টারফেসে স্ট্যাটিক মেথড ডিক্লেয়ার করা যায়। ক্লাসের স্ট্যাটিক মেথডের মতো, ইন্টারফেসেও স্ট্যাটিক মেথড লেখা যায়। আর ক্লাসের মতো, ইন্টারফেসের নামের পর ডট (.) লিখে মেথড কল করা যায় !
এখন এই পর্যায়ে কেউ যদি ভেবে থাকেন যে, ডায়মন্ড ইনহেরিটেন্স-এর কী হবে? অর্থাৎ, যদি কোনো ক্লাস দুটো ইন্টারফেসে ইমপ্লিমেন্ট করে যাদের দুইজনেরই একই নামের (এবং সিগনেচারের) ডিফল্ট মেথড থাকে, তখন কী হবে?? - সাব্বাস! আপনি জাভার ভালোই জ্ঞান রাখেন দেখছি, কারণ আমি যখন প্রথম এই নতুন ফিচারটা পড়ি, আমার মাথাতে একবারের জন্যও ব্যাপারটা আসে নাই। উত্তরটা হচ্ছে, জাভা ৮ কম্পাইল টাইমেই আপনাকে জানিয়ে দিবে যে, আপনি তা করতে পারবেন না - কম্পাইল এরর খাবেন।
সবশেষে অনুরোধ, অবশ্যই জাভা ম্যাগাজিনের সেপ্টেম্বর-অক্টোবর ২০১৬-এর সংখ্যায় মাইকেল কলিং-এর ইন্টারফেসের উপর লেখাটা পড়ে নেবেন, আমার লেখাটা সেখান থেকেই নেয়া! খুবই সুন্দর করে ইন্টারফেস আর ইনহেরিটেন্স-এর ইতিহাস, সুবিধা-অসুবিধা, কখন কোনটা ব্যবহার করা উচিত ইত্যাদি লেখা আছে।
ধন্যবাদ,
--ইশতিয়াক
৩ অক্টোবর, সোমবার ২০১৬
আজকের লেখা খুব ছোট হবে। জাভা ৮ -এর ইন্টারফেস -এর একটা নতুন ফীচার নিয়ে শেখা আর্টিকেল শেয়ার করাই মূল উদ্দেশ্য।
তার আগে, জাভা নিয়ে একটা সাধারণ ভুল সম্পর্কে বলে নেই। জাভা ৮ বললেও আসলে তা ১.৮। জাভার কোনো ভার্সনে যখন কোনো বড় ধরণের পরিবর্তন আসে, তখন সবাই জাভাকে একটা নাম দিয়ে আলাদা করতে চায়। যেমন কেউ কখনো মনে হয় না জাভা ৩ বা জাভা ৪ -এর নাম শুনেছে। আমি অন্তত শুনি নাই। কারণ বড় কোনো ফিচার বা উন্নতি (improvement) জাভা ১.৩ বা ১.৪ - এ সম্ভবতঃ হয় নাই। জাভা ২ (আদতে ১.২) -এর পর জাভা ৫ (আবারো, আসলে ১.৫) -এর কথা শোনার পর এখন জাভা ৮ -এর কথা শুনছি।
যাই হোক, একটা উদাহরণ দিয়ে জাভা ৮-এর ইন্টারফেসের নতুন ফিচারটা ব্যাখ্যা করার চেষ্টা করি।
ধরা যাক, একটা ইন্টারফেস আছে MagicWand (বাংলায় জাদুর লাঠি), যার মধ্যে একটা মেথড সিগনেচার ডিক্লেয়ার করা আছে doMagic. দেখতে অনেকটা নিচের মতো:
public interface MagicWand
{
void doMagic();
}
ধরা যাক, এই ইন্টারফেসটা অনেক আগের লেখা, এবং অসংখ্য ক্লাস এটা ইমপ্লিমেন্ট করে বসে আছে। অনেক জাভা লাইব্রেরি লেখা হয়েছে গেছে এই ইন্টারফেস ইমপ্লিমেন্ট করে। এখন ইন্টারফেস -টার মালিকদের মনে হলো, আরেকটা খুব জোস্ মেথড সিগনেচার ইন্টারফেসটাতে যোগ করা দরকার, doAdvancedMagic() । এটা যোগ করে ইন্টারফেসটার চেহারা বদলিয়ে নিচের মতো করা দরকার:
public interface MagicWand
{
void doMagic();
// new method signature
void doAdvancedMagic();
}
এতে করে কী ঝামেলা হতে পারে বলুন তো? ঠিকই ধরেছেন, আগের ইন্টারফেস ইমপ্লিমেন্ট করা সবগুলো ক্লাস বা লাইব্রেরিগুলো ভেঙে পড়বে। কারণ, কোনো ক্লাসেরই এই নতুন মেথড ইমপ্লিমেন্ট করা নাই।
তাহলে কী করা?
একটা উপায় ছিল (ছিল বলছি কারণ, জাভা ৮-এর আগে এভাবেই সমস্যাটার সমাধান করতে হতো) - নতুন একটা ইন্টারফেস ডিক্লেয়ার করে আগেরটা ইনহেরিট করা, আর নতুনটায় নতুন মেথড যোগ করা।
জাভা ৮ -এ এখন ডিফল্ট মেথড (default method) ব্যবহার করে এর সমাধান করা যায়:
public interface MagicWand
{
void doMagic();
default void doAdvancedMagic() {
// ... some code here
}
}
খেয়াল করে দেখবেন, শুধু নতুন মেথড সিগনেচারই না, মেথডের ডিফল্ট কোডও যোগ করা যায়। নতুন সবগুলো ক্লাস যারা কিনা এই ইন্টারফেস ইমপ্লিমেন্ট করবে, তারা এই নতুন মেথড ব্যবহার করতে পারবে: চাইলে নিজেরা নিজেদের কোড ইমপ্লিমেন্ট করবে বা ওভাররাইড করবে, আর না করলে ডিফল্ট মেথডের কোড ব্যবহার করতে পারবে। আর আগের সব গুলো ক্লাস কোনো ঝামেলা ছাড়াই অর্থাৎ কোড ব্রেক বা ভেঙে পড়া ছাড়াই কাজ করবে। দারুন না ব্যাপারটা?!
আরেকটা নতুন ফিচার হলো, এখন ইন্টারফেসে স্ট্যাটিক মেথড ডিক্লেয়ার করা যায়। ক্লাসের স্ট্যাটিক মেথডের মতো, ইন্টারফেসেও স্ট্যাটিক মেথড লেখা যায়। আর ক্লাসের মতো, ইন্টারফেসের নামের পর ডট (.) লিখে মেথড কল করা যায় !
এখন এই পর্যায়ে কেউ যদি ভেবে থাকেন যে, ডায়মন্ড ইনহেরিটেন্স-এর কী হবে? অর্থাৎ, যদি কোনো ক্লাস দুটো ইন্টারফেসে ইমপ্লিমেন্ট করে যাদের দুইজনেরই একই নামের (এবং সিগনেচারের) ডিফল্ট মেথড থাকে, তখন কী হবে?? - সাব্বাস! আপনি জাভার ভালোই জ্ঞান রাখেন দেখছি, কারণ আমি যখন প্রথম এই নতুন ফিচারটা পড়ি, আমার মাথাতে একবারের জন্যও ব্যাপারটা আসে নাই। উত্তরটা হচ্ছে, জাভা ৮ কম্পাইল টাইমেই আপনাকে জানিয়ে দিবে যে, আপনি তা করতে পারবেন না - কম্পাইল এরর খাবেন।
সবশেষে অনুরোধ, অবশ্যই জাভা ম্যাগাজিনের সেপ্টেম্বর-অক্টোবর ২০১৬-এর সংখ্যায় মাইকেল কলিং-এর ইন্টারফেসের উপর লেখাটা পড়ে নেবেন, আমার লেখাটা সেখান থেকেই নেয়া! খুবই সুন্দর করে ইন্টারফেস আর ইনহেরিটেন্স-এর ইতিহাস, সুবিধা-অসুবিধা, কখন কোনটা ব্যবহার করা উচিত ইত্যাদি লেখা আছে।
ধন্যবাদ,
--ইশতিয়াক
No comments:
Post a Comment