การทำซ้ำเป็นแม่ของการเรียนรู้ แม้ว่าเราจะพูดถึงคีย์เวิร์ด switchของ Java ไปแล้วก่อนหน้านี้ แต่วันนี้เราจะทบทวนข้อมูลพื้นฐานและเจาะลึกข้อมูลใหม่
Java มี โครงสร้าง สวิตช์ สองประเภท : คำสั่งสวิตช์และนิพจน์สวิตช์ การแสดงออกของสวิตช์กลายเป็นทางการใน Java 14 โดยมีอยู่ในตัวแปร "ตัวอย่าง" ที่ไม่เป็นทางการสองแบบในเวอร์ชัน 12 และ 13
แต่ขอเริ่มต้นจากจุดเริ่มต้น ลองนึกถึงสวิตช์เก่าที่ดีก่อนเวอร์ชัน 12:
public String getProductTypeByName(String product) {
String productType = "";
switch (product) {
case "Apple":
productType = "Fruit";
break;
case "Peach":
productType = "Fruit";
break;
case "Raspberry":
productType = "Berry";
break;
case "Cherry":
productType = "Berry";
break;
case "Tomato":
productType = "Vegetable";
break;
default:
productType = "other";
break;
}
return productType;
}
คำสั่ง switch คือชุดของโครงสร้างที่จะดำเนินการทีละชุด ไม่อนุญาตให้คุณส่งคืนค่า ปัญหาหลักในการใช้คำสั่ง switch คือคุณสามารถเพิ่มcase expression ได้ไม่จำกัดจำนวน และความสามารถนี้มักถูกใช้ในทางที่ผิดโดยโปรแกรมเมอร์
Java 12 ได้เห็นการเพิ่มคุณสมบัติการทดลอง: เวอร์ชันใหม่ของ switch — ไม่ใช่คำสั่ง switch แต่เป็นนิพจน์ของ switch — ซึ่งสามารถให้ค่า ใช้การเขียนโปรแกรมเชิงฟังก์ชันภายใน และรวมคำสั่ง case ที่มีค่าร่วมกัน จึงทำให้ สร้างขนาดกะทัดรัด
ใน Java 12 คุณสามารถเขียน เมธอด getProductTypeByName() ใหม่ ได้ดังนี้:
public String getProductTypeByName(String product) {
return switch (product) {
case "Apple", "Peach" -> "Fruit";
case "Raspberry", "Cherry" -> "Berry";
case "Tomato" -> "Vegetable";
default -> "other";
};
}
ตอนนี้โค้ดดูสะอาดขึ้น ไวยากรณ์ลูกศรจากการเขียนโปรแกรมเชิงฟังก์ชันช่วยให้เราส่งกลับค่าโดยไม่ต้องใช้ คีย์เวิร์ด breakและโดยทั่วไปแล้ว ผลลัพธ์ของการดำเนินการสวิตช์สามารถบันทึกลงในตัวแปรหรือส่งคืนผ่านคีย์เวิร์ดส่งคืน ได้แล้ว
หากเราไม่ต้องการเพียงแค่ส่งคืนผลลัพธ์ แต่ยังต้องมีโค้ดหลายบรรทัดด้วยสวิตช์ ของเรา จะมีลักษณะดังนี้:
public String getProductTypeByName(String product) {
var result = switch (product) {
case "Apple", "Peach" -> {
System.out.println("This is a Fruit");
break "Fruit";
}
case "Raspberry", "Cherry" -> {
System.out.println("This is a Berry");
break "Berry";
}
case "Tomato" -> {
System.out.println("This is a Vegetable");
break "Vegetable";
}
default -> {
break "other";
}
};
return result;
}
ใน Java 13 นิพจน์สวิตช์ยังคงเป็นคุณสมบัติทดลอง เพื่อให้ใช้งานได้ เช่นเดียวกับใน Java 12 คุณต้องใช้ คำสั่ง --enable-previewเมื่อคอมไพล์และรัน หลักและโดยพื้นฐานแล้วเพียงอย่างเดียวคือ "นวัตกรรม" ของสวิตช์ใน Java 13 คือ คีย์เวิร์ด yieldซึ่งแทนที่break
public String getProductTypeByName(String product) {
var result = switch (product) {
case "Apple", "Peach" -> {
System.out.println("This is a Fruit");
yield "Fruit";
}
case "Raspberry", "Cherry" -> {
System.out.println("This is a Berry");
yield "Berry";
}
case "Tomato" -> {
System.out.println("This is a Vegetable");
yield "Vegetables";
}
default -> {
System.out.println("Other");
yield "other";
}
};
return result;
}
ข้อแตกต่างหลักระหว่างYieldและBreakคือBreakส่งคืนการควบคุมการดำเนินการจาก คำสั่ง caseแต่Yieldส่งคืนผลลัพธ์ของสวิตช์ ทั้งหมด ทำหน้าที่เหมือนคำสั่งReturn ภายใน
ใน Java 14 ตัวดำเนินการ ของอินสแตนซ์มีการเปลี่ยนแปลงและตอนนี้สามารถใช้งานได้ดังนี้:
if (o instanceof String s) {
s.toLowerCase();
}
แทนที่จะเป็นวิธีเก่าที่ค่อนข้างน่าเกลียดที่คุณไม่เพียงแค่ต้องตรวจสอบตัวแปรโดยใช้instanceof เท่านั้น แต่ยังต้องแปลงเป็นประเภทเฉพาะอีกด้วย
if(s instanceof String) {
((String) s).toLowerCase();
}
การเปลี่ยนแปลงเหล่านี้เป็นส่วนหนึ่งของโครงการ Amber ซึ่งมีจุดมุ่งหมายเพื่อเพิ่มการสนับสนุนการจับคู่รูปแบบให้กับ Java
ต้องขอบคุณการเปลี่ยนแปลงในตัวดำเนินการของอินสแตนซ์ในเวอร์ชัน 14 และส่วนขยายในเวอร์ชัน 16 การจับคู่รูปแบบทำให้มันกลายเป็นเวอร์ชัน 17 ในที่สุด จริงอยู่ตอนนี้เป็นเพียงการแสดงตัวอย่างเท่านั้น คุณสามารถลองใช้--enable-preview :
public String getObjectType(Object object) {
return switch (object) {
case Integer i -> "Integer";
case Long l -> "Long";
case String s -> "String";
default -> object.toString();
};
}
โดยทั่วไปแล้ว เวอร์ชันใหม่แต่ละเวอร์ชันจะนำเสนอคุณลักษณะที่น่าสนใจมากขึ้นในภาษา ซึ่งทำให้การพัฒนา Java ยอดเยี่ยมยิ่งขึ้น