Pengulangan adalah ibu dari pembelajaran. Meskipun sebelumnya kita telah membicarakan tentang kata kunci switch Java , hari ini kita akan meninjau dasar-dasarnya dan menggali beberapa informasi baru.

Java memiliki dua jenis konstruksi switch : pernyataan switch dan ekspresi switch. Ekspresi switch menjadi resmi di Java 14, yang telah ada dalam dua varian "pratinjau" tidak resmi di versi 12 dan 13.

Tapi mari kita mulai dari awal. Mari kita ingat seperti apa tampilan sakelar lama yang bagus 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 switch adalah sekumpulan konstruksi yang akan dieksekusi satu demi satu. Itu tidak membiarkan Anda mengembalikan nilai. Masalah utama dengan menggunakan pernyataan switch adalah Anda dapat menambahkan ekspresi kasus dalam jumlah tak terbatas , dan kemampuan ini sering disalahgunakan oleh pemrogram.

Java 12 melihat penambahan fitur eksperimental: versi baru dari switch — bukan pernyataan switch, tetapi ekspresi switch — yang dapat menghasilkan nilai, menggunakan pemrograman fungsional secara internal, dan menggabungkan pernyataan case yang memiliki nilai yang sama, sehingga membuat membangun kompak.

Di Java 12, Anda dapat menulis ulang metode getProductTypeByName() sebagai berikut:

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

    };
}

Sekarang kodenya terlihat lebih bersih. Sintaks panah dari pemrograman fungsional memungkinkan kita mengembalikan nilai tanpa kata kunci break , dan secara umum, hasil eksekusi sakelar sekarang dapat disimpan ke variabel atau dikembalikan melalui kata kunci return .

Jika kita tidak hanya perlu mengembalikan hasil, tetapi juga memiliki beberapa baris kode, maka peralihan kita akan terlihat 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;
}

Di Java 13, ekspresi sakelar masih merupakan fitur eksperimental. Untuk membuatnya tersedia, seperti di Java 12, Anda perlu menggunakan perintah --enable-preview saat mengompilasi dan menjalankan. "Inovasi" utama, dan pada dasarnya satu-satunya, dari sakelar di Java 13 adalah 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;
}

Perbedaan utama antara yield dan break adalah bahwa break mengembalikan kontrol eksekusi dari pernyataan case , tetapi yield mengembalikan hasil dari seluruh switch , bertindak seperti pernyataan pengembalian internal .

Di Java 14, operator instanceof telah berubah dan sekarang dapat digunakan seperti ini:

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

Alih-alih cara lama yang agak jelek di mana Anda tidak hanya harus memeriksa variabel menggunakan instanceof , tetapi juga melemparkannya ke tipe tertentu.

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

Perubahan ini merupakan bagian dari proyek Amber, yang bertujuan untuk menambahkan dukungan pencocokan pola ke Java.

Berkat perubahan operator instanceof di versi 14 dan ekstensi di versi 16, pencocokan pola memang membuatnya menjadi versi 17. Benar, itu hanya ada sebagai pratinjau untuk saat ini. Anda dapat mencobanya 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 baru menghadirkan lebih banyak fitur menarik ke dalam bahasa, yang membuat pengembangan Java semakin keren.