เมื่อเขียนโค้ดที่มีเงื่อนไขจำนวนมาก คุณต้องใช้คำสั่งif-elseหรือswitch อย่างใดอย่างหนึ่ง แต่ทางเลือกของif-else นี้ มีข้อเสีย บางคนถึงกับเรียก คำสั่ง switchว่า "anti-pattern"

นั่นอะไร? Anti-pattern เป็นรูปแบบทั่วไปของโค้ดที่ไม่ถูกต้อง กล่าวคือเป็นวิธีแก้ปัญหาที่ไม่ถูกต้อง โปรแกรมเมอร์พยายามหลีกเลี่ยงสิ่งเหล่านี้ในโค้ด เนื่องจากจะทำให้คุณภาพของโค้ดลดลง

แต่มีข่าวดี: Java เวอร์ชันใหม่ทำให้เกิด การเปลี่ยนแปลงมากมายในไวยากรณ์ของภาษา และหนึ่งในการเปลี่ยนแปลงเหล่านั้นจะส่งผลต่อswitch ทึ่ง? แล้วไปดำน้ำกัน

เริ่มต้นด้วย คุณควรชี้แจงว่าทำไมสวิตช์ถึงเป็นรูปแบบต่อต้าน พิจารณารหัสต่อไปนี้:


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;
}

มาเพิ่มอีกสองสามบรรทัด — โค้ดจะยาวขึ้น ต่อมาเราสามารถเพิ่มบรรทัดได้มากขึ้นและจะไม่มีใครหยุดเราไม่ให้ทำสิ่งนี้

นี่คือหัวใจของปัญหา: หลังจากเริ่มสร้าง คำสั่ง สวิตช์ขนาดกะทัดรัด เราเพิ่มโค้ดมากขึ้นเรื่อย ๆ ใช้พื้นที่มากขึ้นเรื่อย ๆ มากเกินกว่าจะพอดีกับหน้าจอ และทำให้โค้ดไม่สะดวกต่อการอ่านและบำรุงรักษา

ความแตกต่างระหว่างคำสั่ง switch และนิพจน์ switch

Java 14 นำเสนอสวิตช์ใหม่ที่ได้รับการปรับปรุง ไม่ใช่ คำ สั่งswitchแต่เป็นนิพจน์สวิตช์

อะไรคือความแตกต่างที่คุณถาม? ข้อแตกต่างคือคำสั่งเป็นคำสั่งที่ดำเนินการชุดของการดำเนินการบางอย่าง แต่นิพจน์เป็นส่วนหนึ่งของรหัสที่ดำเนินการคำนวณและส่งคืนผลลัพธ์

กล่าวอีกนัยหนึ่ง ตอนนี้คุณสามารถบันทึกผลลัพธ์ของการเปลี่ยนเป็นตัวแปรได้แล้ว

พูดพอแล้ว ทีนี้มาดูกันว่าสวิตช์ ใหม่ มีลักษณะอย่างไร:


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");
}

โปรดทราบว่าสวิตช์ไม่มีคำสั่งพัก อีกต่อไป มันถูกลบออกใน Java 13 และแทนที่ด้วยyield

ผลตอบแทนคืออะไรและสามารถใช้ที่ไหน?

เมื่อสวิตช์ประกอบด้วยบรรทัดเดียว ตัวดำเนินการ ->จะส่งกลับค่าเอง แต่ถ้าเราไม่มีรหัส แต่มีรหัสหลายบรรทัดล่ะ ในกรณีเช่นนี้ ตัวดำเนินการลูกศรจะไม่ส่งกลับค่า เนื่องจากมีหลายบรรทัด ไม่ใช่หนึ่งบรรทัด

บางทีเราสามารถใช้return ? ท้ายที่สุดมันถูกใช้เพื่อส่งคืนค่าใน Java อนิจจา ไม่การย้อนกลับจะใช้สวิตช์ไม่ได้ แล้วเราจะใช้อะไรได้บ้าง? เคยมีคำ ว่า breakแต่ถูกลบออกไปใน Java 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";

	}
};

อัตราผลตอบแทนถูกเพิ่มใน Java 13 สำหรับกรณีที่เรามีโค้ดมากกว่าหนึ่งบรรทัดในบล็อกเคส และเราจำเป็นต้องส่งคืนผลลัพธ์

คุณอาจอยากลองสวิตช์ ใหม่ ในโค้ดของคุณ แต่โปรดจำไว้ว่าคุณต้องมี Java 14 หรือสูงกว่าจึงจะทำได้ สำหรับเวอร์ชันก่อนหน้านี้สวิตช์นี้จะใช้ได้ก็ต่อเมื่อคุณระบุแฟล็ก "--enable-preview" ในบรรทัดคำสั่ง เนื่องจากก่อนหน้าเวอร์ชัน 14 สวิตช์นี้จะเป็นส่วนหนึ่งของการแสดงตัวอย่างทางเทคนิค ไม่ใช่ส่วนที่สมบูรณ์ของภาษา

นั่นคือทั้งหมดที่สำหรับตอนนี้! พบกันใหม่!