Pengulangan adalah ibu kepada pembelajaran. Walaupun kami telah bercakap tentang kata kunci suis Java lebih awal, hari ini kami akan menyemak asas dan menggali beberapa maklumat baharu.

Java mempunyai dua jenis binaan suis : pernyataan suis dan ungkapan suis. Ungkapan suis menjadi rasmi di Java 14, setelah wujud dalam dua varian "pratonton" tidak rasmi dalam versi 12 dan 13.

Tetapi mari kita mulakan dari awal. Mari kita ingat bagaimana suis lama yang baik kelihatan sebelum versi 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;
}

Pernyataan suis ialah satu set binaan yang akan dilaksanakan satu demi satu. Ia tidak membenarkan anda mengembalikan nilai. Masalah utama dengan menggunakan pernyataan suis ialah anda boleh menambah bilangan ungkapan kes yang tidak terhingga , dan keupayaan ini sering disalahgunakan oleh pengaturcara.

Java 12 menyaksikan penambahan ciri eksperimen: versi baharu suis — bukan pernyataan suis, tetapi ungkapan suis — yang boleh menghasilkan nilai, menggunakan pengaturcaraan berfungsi secara dalaman dan menggabungkan pernyataan kes yang mempunyai nilai yang sama, dengan itu menjadikan membina padat.

Dalam Java 12, anda boleh menulis semula kaedah getProductTypeByName() seperti berikut:


public String getProductTypeByName(String product) {
    return switch (product) {
        case "Apple", "Peach" -> "Fruit";
        case "Raspberry", "Cherry" -> "Berry";
        case "Tomato" -> "Vegetable";
        default -> "other";

    };
}

Kini kod itu kelihatan lebih bersih. Sintaks anak panah daripada pengaturcaraan berfungsi membolehkan kami mengembalikan nilai tanpa kata kunci rehat , dan secara amnya, hasil daripada melaksanakan suis kini boleh disimpan ke pembolehubah atau dikembalikan melalui kata kunci pulangan .

Jika kita bukan sahaja perlu mengembalikan hasil, tetapi juga mempunyai berbilang baris kod, maka suis kita akan kelihatan seperti ini:


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

Dalam Java 13, ungkapan suis masih merupakan ciri percubaan. Untuk menyediakannya, sama seperti dalam Java 12, anda perlu menggunakan perintah --enable-preview semasa menyusun dan menjalankan. Utama, dan pada asasnya sahaja, "inovasi" suis dalam Java 13 ialah kata kunci hasil , yang menggantikan 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;
}

Perbezaan utama antara hasil dan pemecahan ialah pemecahan mengembalikan kawalan pelaksanaan daripada pernyataan kes , tetapi hasil mengembalikan hasil keseluruhan suis , bertindak seperti penyata pulangan dalaman .

Dalam Java 14, pengendali instanceof telah berubah dan kini boleh digunakan seperti ini:


if (o instanceof String s) {
s.toLowerCase();
}

Daripada cara lama yang agak hodoh di mana anda perlu bukan sahaja menyemak pembolehubah menggunakan instanceof , tetapi juga menghantarnya ke jenis tertentu.


if(s instanceof String) {
((String) s).toLowerCase();
}

Perubahan ini adalah sebahagian daripada projek Amber, yang bertujuan untuk menambah sokongan padanan corak pada Java.

Terima kasih kepada perubahan dalam instanceof operator dalam versi 14 dan sambungan dalam versi 16, padanan corak telah menjadikannya versi 17. Benar, ia hanya wujud sebagai pratonton buat masa ini. Anda boleh mencubanya dengan --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();
    };
}

Secara umum, setiap versi baharu membawa lebih banyak ciri menarik ke dalam bahasa, yang menjadikan pembangunan Java lebih keren.