জাভা এর প্রতিটি নতুন সংস্করণ আগে আসা সংস্করণ থেকে ভিন্ন। এখানে উপাদানের পরিবর্তনের একটি উদাহরণ যা আমরা কভার করেছি: জাভা 5 এর আগে, ভাষাতে
একইভাবে, জাভা 8 জাভা 7 থেকে স্পষ্টভাবে আলাদা। আমাদের বেশিরভাগ পাঠ ভাষাটির 7 তম সংস্করণের জন্য লেখা হয়েছিল, তবে অবশ্যই আমরা গুরুত্বপূর্ণ উদ্ভাবনগুলিকে উপেক্ষা করব না। যেহেতু আমরা ইতিমধ্যেই এই পাঠে ইন্টারফেস সম্পর্কে কথা বলছি, তাই আমরা একটি আপডেট বিবেচনা করব — ইন্টারফেসে ডিফল্ট পদ্ধতি । আপনি ইতিমধ্যে জানেন যে একটি ইন্টারফেস আচরণ বাস্তবায়ন করে না । এর কাজ হল আচরণ বর্ণনা করা যা এটি বাস্তবায়নকারী সমস্ত বস্তুর অবশ্যই থাকতে হবে. কিন্তু ডেভেলপাররা প্রায়শই এমন পরিস্থিতির সম্মুখীন হন যেখানে একটি পদ্ধতির প্রয়োগ সব শ্রেণিতে একই রকম হয়। আমাদের পুরানো গাড়ির উদাহরণ বিবেচনা করা যাক:
enum
s ছিল না। ![ইন্টারফেসে ডিফল্ট পদ্ধতি - 1](https://cdn.codegym.cc/images/article/34d25d0e-f8da-43f7-ab2b-5333c5a01585/800.jpeg)
public interface Car {
public void gas();
public void brake();
}
public class Sedan implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
public class Truck implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
public class F1Car implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
"আপনার মতে, এই কোডের প্রধান সমস্যা কি? আপনি সম্ভবত লক্ষ্য করেছেন যে আমরা বারবার কোডের একটি গুচ্ছ লিখেছি! এই সমস্যাটি প্রোগ্রামিংয়ে সাধারণ, এবং আপনাকে এটি এড়াতে হবে। এটি অন্য বিষয় যে বিশেষ সমাধান আগে বিদ্যমান ছিল না জাভা 8 রিলিজ করা হয়েছে৷ এই সংস্করণের সাথে ডিফল্ট পদ্ধতিগুলি নির্দিষ্ট করার এবং ইন্টারফেসের মধ্যেই সেগুলি প্রয়োগ করার ক্ষমতা এসেছে ! আপনি এটি কীভাবে করবেন তা এখানে:
public interface Car {
public default void gas() {
System.out.println("Gas!");
}
public default void brake() {
System.out.println("Brake!");
}
}
public class Sedan implements Car {
}
public class Truck implements Car {
}
public class F1Car implements Car {
}
এখন gas()
এবং brake()
পদ্ধতিগুলি, যা সমস্ত গাড়ির জন্য একই ছিল, ইন্টারফেসে সরানো হয়েছে। কোন পুনরাবৃত্তি কোড প্রয়োজন নেই. আরো কি, প্রতিটি ক্লাসে পদ্ধতি পাওয়া যায়!
public class Main {
public static void main(String[] args) {
F1Car f1Car = new F1Car();
Sedan sedan = new Sedan();
Truck truck = new Truck();
truck.gas();
sedan.gas();
f1Car.brake();
}
}
যদি পদ্ধতির সাথে 100টি ক্লাস থাকে gas()
তবে তাদের মধ্যে মাত্র 99টি একই আচরণ করে? এটি কি সবকিছু নষ্ট করে এবং ডিফল্ট পদ্ধতিটিকে এই পরিস্থিতির জন্য অযোগ্য করে তোলে? অবশ্যই, না :) ইন্টারফেসে ডিফল্ট পদ্ধতিগুলি সাধারণের মতো একইভাবে ওভাররাইড করা যেতে পারে।
public class UnusualCar implements Car {
@Override
public void gas() {
System.out.println("This car accelerates differently!");
}
@Override
public void brake() {
System.out.println("This car decelerates differently!");
}
}
অন্যান্য 99 ধরনের গাড়ি ডিফল্ট পদ্ধতি প্রয়োগ করবে, এবংUnusualCar
ক্লাস, যা একটি ব্যতিক্রম, সামগ্রিক ছবি লুণ্ঠন করবে না এবং শান্তভাবে তার নিজস্ব আচরণ সংজ্ঞায়িত করবে। ইন্টারফেসের একাধিক উত্তরাধিকার। আপনি ইতিমধ্যে জানেন, জাভা একাধিক উত্তরাধিকার সমর্থন করে না। এই জন্য অনেক কারণ আছে। আমরা একটি পৃথক পাঠে তাদের বিস্তারিতভাবে দেখব। অন্যান্য ভাষা, যেমন C++, এটি সমর্থন করে। একাধিক উত্তরাধিকার ছাড়া, একটি গুরুতর সমস্যা দেখা দেয়: একটি বস্তুর বিভিন্ন বৈশিষ্ট্য এবং 'আচরণ' থাকতে পারে। এখানে জীবন থেকে একটি উদাহরণ: আমরা আমাদের পিতামাতার কাছে শিশু, আমাদের শিক্ষকদের কাছে ছাত্র এবং আমাদের ডাক্তারদের কাছে রোগী। জীবনে, আমরা বিভিন্ন ভূমিকা গ্রহণ করি এবং সেই অনুযায়ী, ভিন্নভাবে আচরণ করি: স্পষ্টতই, আমরা আমাদের ঘনিষ্ঠ বন্ধুদের সাথে যেভাবে কথা বলি শিক্ষকদের সাথে কথা বলি না। আসুন কোডে এটি অনুবাদ করার চেষ্টা করি। কল্পনা করুন যে আমাদের দুটি শ্রেণী রয়েছে: পুকুর এবং এভিয়ারি। পুকুরের জন্য, আমাদের জলের পাখির প্রয়োজন; এভিয়ারির জন্য, আমাদের উড়ন্ত পাখি দরকার। এটি করার জন্য, আমরা দুটি বেস ক্লাস তৈরি করেছি:FlyingBird
এবং Waterfowl
_
public class Waterfowl {
}
public class FlyingBird {
}
FlyingBird
তদনুসারে, আমরা যেসব পাখির শ্রেণী উত্তরাধিকার সূত্রে প্রাপ্ত পাখিদের এভিয়ারিতে পাঠাব , এবং আমরা Waterfowl
পুকুরে উত্তরাধিকারী পাখি পাঠাব। এটা সব খুব সহজ মনে হয়. কিন্তু আমরা হাঁস পাঠাব কোথায়? এটি সাঁতার কাটে এবং উড়ে যায়। এবং আমাদের একাধিক উত্তরাধিকার নেই। সৌভাগ্যবশত, জাভা ইন্টারফেসের একাধিক বাস্তবায়ন সমর্থন করে। যদিও একটি ক্লাস একাধিক পিতামাতার উত্তরাধিকারী হতে পারে না, এটি সহজেই বেশ কয়েকটি ইন্টারফেস বাস্তবায়ন করতে পারে! আমাদের হাঁস একটি উড়ন্ত পাখি এবং একটি জলপাখি উভয়ই হতে পারে :) কাঙ্ক্ষিত ফলাফল অর্জনের জন্য আমাদের কেবল ক্লাসের পরিবর্তে ইন্টারফেস FlyingBird
তৈরি করতে হবে।Waterfowl
public class Duck implements FlyingBird, Waterfowl {
// The methods of both interfaces can be easily combined into one class
@Override
public void fly() {
System.out.println("Fly!");
}
@Override
public void swim() {
System.out.println("Swim!");
}
}
তদনুসারে, আমাদের প্রোগ্রামটি ক্লাসের নমনীয়তা বজায় রাখে এবং, ডিফল্ট পদ্ধতির সাথে সমন্বয়ে, বস্তুর আচরণকে সংজ্ঞায়িত করার আমাদের ক্ষমতা প্রায় সীমাহীন হয়ে যায়! :)