একটি if/else স্টেটমেন্টের মতো, একটি switch স্টেটমেন্টও শর্তসাপেক্ষে কোড চালিয়ে প্রোগ্রামের প্রবাহ বদলানোর সুযোগ দেয়।
পার্থক্য হলো, একটি switch স্টেটমেন্ট কেবল আগে থেকে নির্ধারিত ধ্রুবক মানের সাথে একটি প্রিমিটিভ বা স্ট্রিং এক্সপ্রেশনের মানের তুলনা করতে পারে।
switch স্টেটমেন্ট ব্যবহারের সময় কিছু কিওয়ার্ড কাজে লাগে।
switch: এই কিওয়ার্ডটি দিয়ে switch-এর গঠন ঘোষণা করা যায়।
এর পরে থাকে সেই এক্সপ্রেশন বা ভ্যারিয়েবল, যার কারণে ফলাফল বদলে যায়।case: ফলাফলের বিভিন্ন সম্ভাব্য রূপ ঘোষণা করতে এটি ব্যবহার করবেন।break: কাঙ্ক্ষিত প্রবাহের শেষে switch-এর এক্সিকিউশন থামানোর জন্য break কিওয়ার্ডটি খুবই কাজের।
এটি ভুলে গেলে প্রোগ্রাম চলতেই থাকবে এবং অপ্রত্যাশিত ফলাফল দিতে পারে।default: নাম থেকেই বোঝা যায়, অন্য কোনো case আপনার এক্সপ্রেশনের ফলাফলের সাথে না মিললে ডিফল্ট ফলাফল হিসেবে এটি ব্যবহার করুন।সরলতম রূপে এগুলো একটি প্রিমিটিভ বা স্ট্রিং এক্সপ্রেশন পরীক্ষা করে এবং তার মানের ভিত্তিতে সিদ্ধান্ত নেয়। উদাহরণস্বরূপ:
String direction = getDirection();
switch (direction) {
case "left":
goLeft();
break;
case "right":
goRight();
break;
default:
// otherwise
markTime();
break;
}
Java 14 থেকে (আগে Java 12 ও 13-এ প্রিভিউ হিসেবে পাওয়া যেত) "উন্নত" switch বাস্তবায়ন ব্যবহার করা সম্ভব।
একটি case-এ একাধিক মান অ্যাসাইন করার সুযোগ আছে।
প্রচলিত switch-স্টেটমেন্টে fall-through ব্যবহার করা যায়। নিচের উদাহরণে case 1 ও case 3 একই কাজ করবে।
এটি সম্ভব হয় কারণ case 1-এ break কিওয়ার্ড ব্যবহার করা হয় না।
switch (number) {
case 1:
case 3:
// do same stuff
break;
case 2:
// do different stuff
break;
// (...)
}
উন্নত switch expression-এ আপনি সরাসরি একটি case-এ একাধিক মান দিতে পারেন।
নিচের উদাহরণটি দেখুন:
switch (number) {
case 1, 3:
// do stuff
break;
case 2:
// do other stuff
break;
// (...)
}
এখন আপনি একটি switch-statement বা একটি switch expression লিখতে পারেন।
পার্থক্যটা কী?
মূলত একটি স্টেটমেন্ট কিছু কঠোর যুক্তি আশা করে, আর একটি এক্সপ্রেশন একটি মান রিটার্ন করতে পারে।
এর বদলে:
String result = "";
switch (expression) {
case "bob":
result = "bob";
break;
// (...)
}
আপনি এভাবে করতে পারেন:
String result = switch (expression) {
case "bob":
yield "bob";
// (...)
}
yield একটি return-এর মতোই কাজ করে, তবে এটি switch এক্সপ্রেশনের জন্য।
যেহেতু yield এক্সপ্রেশনটি শেষ করে দেয়, তাই এখানে break-এর দরকার নেই।
switch statements ও switch expressions-এর আরেকটি পার্থক্য: switch expressions-এ আপনাকে অবশ্যই সব case কভার করতে হবে।
হয় সমস্ত সম্ভাব্য মানের জন্য একটি case রেখে, নয়তো একটি default case ব্যবহার করে।
: চিহ্নের বদলে -> ব্যবহার করতে পারেন।
-> ব্যবহার করলে break কিওয়ার্ড লেখার দরকার হয় না।
দুটি নোটেশনই ব্যবহার করা যায়, তবে একটি switch-এ যেকোনো একটি বেছে নিতে হবে।
switch(expression) {
case 1 -> yield "one"
case 2 -> yield "two"
default: yield "other number" // Removing this will result in a compile error
}
স্কোপ।
প্রচলিত switch-এর স্কোপের কারণে কিছু অপ্রত্যাশিত আচরণ দেখা দিতে পারে, কারণ পুরো switch-এর জন্য স্কোপ মাত্র একটি।
switch(expression) {
case 1:
String message = "something";
break;
case 2:
String message = "anything";
break;
// (...)
}
এই উদাহরণটি কাজ করে না, কারণ switch-এর ভেতরে message দুবার ঘোষণা করা হয়েছে।
এটি এভাবে সমাধান করা যায়:
switch (expression) {
case 1: {
String message = "something";
break;
}
case 2: {
String message = "anything";
break;
}
// (...)
}
এখানে {} একটি case-এর স্কোপ নির্ধারণ করে।
তবে এটি স্বাভাবিক নয়, কারণ {} বাধ্যতামূলক নয়।
কিন্তু নতুন -> নোটেশন ব্যবহার করলে তার পরে থাকতে হবে হয় একটি একক স্টেটমেন্ট/এক্সপ্রেশন, একটি throw স্টেটমেন্ট, নয়তো একটি {} ব্লক।
আর কোনো বিভ্রান্তি নেই!
উন্নত switch সম্পর্কে আরও তথ্য পাবেন এই লেখাটিতে ও এই লেখাটিতে, সাথে অফিসিয়াল Oracle ডকুমেন্টেশন-এ।
এছাড়াও, Java 21-এ Guarded Patterns নামের একটি ফিচার যোগ করা হয়েছে, যা দিয়ে case লেবেলেই যাচাই করা যায়।
String dayOfMonth = getDayOfMonth();
String day = "";
return switch (day) {
case "Tuesday" when dayOfMonth == 13 -> "Forbidden day!!";
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "Week day";
case "Saturday", "Sunday" -> "Weekend";
default -> "Unknown";
};
Java 21-এ switch এক্সপ্রেশন সম্পর্কে আরও তথ্য পাবেন এই ব্লগে