การทำซ้ำเป็นแม่ของการเรียนรู้ แม้ว่าเราจะพูดถึงคีย์เวิร์ด 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 ยอดเยี่ยมยิ่งขึ้น