অনেক শর্ত সহ কোড লেখার সময়, আপনি অবশ্যই একটি if-else বা একটি সুইচ স্টেটমেন্ট ব্যবহার করেছেন। কিন্তু if-else- এর এই বিকল্পের ত্রুটি রয়েছে। কিছু লোক এমনকি সুইচ বিবৃতিটিকে "অ্যান্টি-প্যাটার্ন" বলে অভিহিত করেছে ।

ওটা কী? একটি অ্যান্টি-প্যাটার্ন হল খারাপ কোডের একটি সাধারণ প্যাটার্ন, অর্থাৎ একটি সমস্যার খারাপ সমাধান। প্রোগ্রামাররা এগুলিকে কোডে এড়াতে চেষ্টা করে, যেহেতু তারা কোডের গুণমানকে অবনমিত করে।

কিন্তু একটি ভাল খবর আছে: জাভা-এর নতুন সংস্করণগুলি ভাষার সিনট্যাক্সে অনেক পরিবর্তন এনেছে এবং সেই পরিবর্তনগুলির মধ্যে একটি সুইচকে প্রভাবিত করে । কৌতূহলী? তাহলে এর মধ্যে ডুব দেওয়া যাক.

শুরু করার জন্য, কেন সুইচ একটি বিরোধী প্যাটার্ন তা স্পষ্ট করা মূল্যবান । নিম্নলিখিত কোড বিবেচনা করুন:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    default:
        seasonNumber = 0;
}

ঠিক আছে, তাই এটি এখনও সম্পূর্ণরূপে পরিষ্কার নয় কেন এটি একটি "অ্যান্টি-প্যাটার্ন"।

কিন্তু যদি আমরা আরও কেস ব্লক যোগ করি এবং এখন কোডটি এরকম দেখায়:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    case “MARCH”:
        seasonNumber = 2;
        break;
    case “APRIL”:
        seasonNumber = 2;
        break;
    case “MAY”:
        seasonNumber = 2;
        break;
    default:
        seasonNumber = 0;
}

আসুন আরও কয়েকটি লাইন যোগ করি — কোডটি আরও দীর্ঘ হয়। পরবর্তীতে আমরা আরও এবং আরও লাইন যোগ করতে পারি, এবং কেউ আমাদের এটি করতে বাধা দেবে না।

এটি হল সমস্যার মূল: প্রাথমিকভাবে একটি কমপ্যাক্ট সুইচ স্টেটমেন্ট তৈরি করার পরে, আমরা এটিতে আরও বেশি বেশি কোড যোগ করি, আরও বেশি জায়গা নিচ্ছি — যা স্ক্রিনে ফিট হবে তার চেয়ে বেশি — এবং কোডটিকে পড়তে এবং বজায় রাখতে অসুবিধাজনক করে তুলছি।

সুইচ স্টেটমেন্ট এবং সুইচ এক্সপ্রেশনের মধ্যে পার্থক্য

Java 14 একটি নতুন এবং উন্নত সুইচ চালু করেছে। এটি একটি সুইচ স্টেটমেন্ট নয় , বরং একটি সুইচ এক্সপ্রেশন

পার্থক্য কি, আপনি জিজ্ঞাসা? পার্থক্য হল যে একটি বিবৃতি হল একটি নির্দেশ যা একটি নির্দিষ্ট সেট ক্রিয়াকলাপ সম্পাদন করে, কিন্তু একটি অভিব্যক্তি হল কোডের একটি অংশ যা কিছু গণনা করে এবং ফলাফল প্রদান করে।

অন্য কথায়, এখন আপনি একটি পরিবর্তনশীল পরিবর্তনের ফলাফল সংরক্ষণ করতে পারেন ।

যথেষ্ট কথা বলা। এখন দেখা যাক নতুন সুইচটি কেমন দেখায়:


var result = switch(month) {
     case DECEMBER, JANUARY, FEBRUARY -> 1;
     case MARCH, APRIL, MAY -> 2;
    case JUNE, JULY, AUGUST -> 3;
    case SEPTEMBER, OCTOBER, NOVEMBER -> 4;
    default -> 0; 
};

কোডটি কতটা কমপ্যাক্ট তা হল আপনার নজর কেড়ে নেওয়া প্রথম জিনিস। যে কোডটি স্ক্রীনের বেশিরভাগ অংশ গ্রহণ করত তা এখন কয়েকটি লাইন বিস্তৃত করে এবং অনেক বেশি পাঠযোগ্য দেখায়।

-> অপারেটর

আপনার -> অপারেটর (তীর অপারেটর) নোট করা উচিত । আপনার যদি ল্যাম্বডা এক্সপ্রেশনের অভিজ্ঞতা থাকে তবে আপনি ইতিমধ্যে এটির সাথে পরিচিত হতে পারেন।

এর মানে এখন আপনি ল্যাম্বডা স্টেটমেন্টের স্টাইলে একটি শান্ত- সুইচ লিখতে পারেন। তীর অপারেটর নির্দেশ করে যে কম্পাইলার পরবর্তী কেস এক্সপ্রেশনে অগ্রসর হবে না (যদি বর্তমান কেস ব্লকে বিরতি বা রিটার্ন স্টেটমেন্টের অভাব থাকে), তবে পরিবর্তে আপনাকে তীরের ডানদিকে অভিব্যক্তিটির মান দেবে।

আপনি এমন কোডও লিখতে পারেন যা একটি অভিব্যক্তি নয় এবং কিছু ফেরত দেওয়ার পরিবর্তে কেবল নির্দিষ্ট ক্রিয়া সম্পাদন করে:


switch(condition) {
    case TRUE, FALSE -> System.out.println("True/false");
  
    default -> System.out.println("Another");
}

নোট করুন যে সুইচের আর একটি বিরতি বিবৃতি নেই । এটি জাভা 13 এ সরানো হয়েছিল এবং ফলন দিয়ে প্রতিস্থাপিত হয়েছিল ।

ফলন কি এবং কোথায় ব্যবহার করা যেতে পারে?

যখন একটি সুইচ একটি একক লাইন নিয়ে গঠিত, তখন -> অপারেটর নিজেই মান প্রদান করে। কিন্তু যদি আমরা এক না, কিন্তু কোড অনেক লাইন আছে? এই ধরনের ক্ষেত্রে, তীর অপারেটর একটি মান ফেরত দেবে না, যেহেতু একাধিক লাইন আছে, একটি নয়।

হয়তো আমরা রিটার্ন ব্যবহার করতে পারি ? সর্বোপরি, এটি জাভাতে মান ফেরাতে ব্যবহৃত হয়। হায়রে, না, রিটার্ন একটি সুইচ দিয়ে কাজ করবে না। তাই আমরা কি ব্যবহার করতে পারি? আগে ব্রেক থাকত , কিন্তু জাভা 13-এ সেটি মুছে ফেলা হয়েছিল। কিন্তু এর জায়গায় এখন আমাদের কাছে রয়েছে yield — একটি নতুন কীওয়ার্ড যা আপনাকে একটি সুইচ থেকে একটি মান ফেরাতে সাহায্য করে। এটা পদ্ধতিতে বিবৃতি ফেরত সাদৃশ্য .


var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};  

এই কোডটিতে একটি একক লাইন রয়েছে এবং -> অপারেটর "অভিবাদন" প্রদান করবে।

কিন্তু যখন আমাদের কোডের একটি ব্লক থাকে:


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 Here you need to return "greeting"
	}
};  

কীওয়ার্ড যা আপনাকে একটি মান ফেরত দিতে সাহায্য করবে তা হল ফলন :


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 yield "greeting";

	}
};

জাভা 13-এ yield যোগ করা হয়েছে এমন ক্ষেত্রে যেখানে আমাদের একটি কেস ব্লকে একাধিক লাইন কোড আছে এবং আমাদের একটি ফলাফল ফেরত দিতে হবে।

আপনি সম্ভবত আপনার কোডে নতুন সুইচ ব্যবহার করে দেখতে আগ্রহী, কিন্তু মনে রাখবেন এটি করার জন্য আপনার Java 14 বা উচ্চতর প্রয়োজন। পূর্ববর্তী সংস্করণগুলির সাথে, এই সুইচটি কেবলমাত্র তখনই উপলব্ধ হবে যদি আপনি কমান্ড লাইনে "--সক্ষম-প্রিভিউ" পতাকাটি নির্দিষ্ট করেন, যেহেতু সংস্করণ 14 এর আগে এটি প্রযুক্তিগত পূর্বরূপের অংশ ছিল, ভাষার একটি সম্পূর্ণ অংশ নয়।

এখন এ পর্যন্তই! দেখা হবে!