Repetiția este mama învățării. Deși am vorbit deja despre cuvântul cheie switch al Java mai devreme, astăzi vom trece în revistă elementele de bază și vom cerceta câteva informații noi.

Java are două tipuri de constructe switch : instrucțiunea switch și expresia switch. Expresia de comutare a devenit oficială în Java 14, având în vedere două variante neoficiale de „previzualizare” în versiunile 12 și 13.

Dar să începem de la început. Să ne amintim cum arăta un comutator vechi bun înainte de versiunea 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;
}

O instrucțiune switch este un set de constructe care vor fi executate una după alta. Nu vă permite să returnați o valoare. Principala problemă cu utilizarea unei instrucțiuni switch este că puteți adăuga un număr infinit de expresii case , iar această abilitate este adesea abuzată de programatori.

Java 12 a văzut adăugarea unei caracteristici experimentale: o nouă versiune a switch - nu o instrucțiune switch, ci o expresie switch - care poate produce o valoare, poate folosi programarea funcțională în interior și poate îmbina instrucțiunile case care au o valoare comună, făcând astfel construi compact.

În Java 12, puteți rescrie metoda getProductTypeByName() după cum urmează:

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

    };
}

Acum codul pare mai curat. Sintaxa săgeată din programarea funcțională ne permite să returnăm valori fără cuvântul cheie break și, în general, rezultatul executării comutatorului poate fi acum salvat într-o variabilă sau returnat prin cuvântul cheie return .

Dacă nu trebuie doar să returnăm un rezultat, ci și să avem mai multe linii de cod, atunci comutatorul nostru ar arăta astfel:

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

În Java 13, expresia switch era încă o caracteristică experimentală. Pentru a-l face disponibil, la fel ca în Java 12, trebuie să utilizați comanda --enable-preview atunci când compilați și rulați. Principala și, în esență, singura „inovație” a comutatorului din Java 13 este cuvântul cheie yield , care a înlocuit 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;
}

Principala diferență dintre yield și break este că break returnează controlul execuției dintr-o instrucțiune case , dar yield returnează rezultatul întregului switch , acționând ca o instrucțiune de returnare internă .

În Java 14, operatorul instanceof s-a schimbat și poate fi folosit acum astfel:

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

În locul modului vechi oarecum urât în ​​care trebuia nu numai să verificați variabila folosind instanceof , ci și să o aruncați într-un anumit tip.

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

Aceste modificări fac parte din proiectul Amber, care își propune să adauge suport pentru potrivirea modelelor la Java.

Datorită schimbării operatorului de instanță în versiunea 14 și unei extensii în versiunea 16, potrivirea modelelor a ajuns până la urmă în versiunea 17. Adevărat, deocamdată există doar ca previzualizare. Puteți încerca cu --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();
    };
}

În general, fiecare versiune nouă aduce caracteristici din ce în ce mai interesante în limbaj, ceea ce face dezvoltarea Java și mai mișto.