เมื่อเขียนโค้ดที่มีเงื่อนไขจำนวนมาก คุณต้องใช้คำสั่ง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 สวิตช์นี้จะเป็นส่วนหนึ่งของการแสดงตัวอย่างทางเทคนิค ไม่ใช่ส่วนที่สมบูรณ์ของภาษา
นั่นคือทั้งหมดที่สำหรับตอนนี้! พบกันใหม่!
GO TO FULL VERSION