Powtarzanie jest matką nauki. Chociaż o przełączniku w Javie mówiliśmy już wcześniej , dzisiaj przypomnimy sobie podstawy i przeanalizujemy kilka nowych informacji.

Java ma 2 warianty przełącznika - są to instrukcja przełącznika i wyrażenie przełącznika. Wyrażenie switch było oficjalnie w Javie w wersji 14, mając wcześniej 2 modyfikacje w wersjach 12 i 13.

Ale zacznijmy od nowa, pamiętajmy, jak wyglądał stary dobry przełącznik przed wersją 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;
}

instrukcja switch to zestaw konstrukcji, które będą wykonywane jedna po drugiej, nie pozwalając na zwrócenie wyniku wykonania. Głównym problemem związanym z używaniem instrukcji switch jest to, że umożliwia ona dodanie nieskończonej liczby instrukcji case , co jest często nadużywane przez programistów.

W Javie 12 został dodany jako funkcja eksperymentalna, a nie jako instrukcja switch, ale jako wyrażenie switch - nowa wersja przełącznika, która umożliwia zapisanie wyniku wykonania, wykorzystanie podejścia funkcjonalnego wewnątrz i pogrupuj wartość w wyrażeniach case, czyniąc ją zwartą.

Możesz przepisać metodę getProductTypeByName() przy użyciu języka Java 12 w następujący sposób:


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

    };
}

Teraz kod wygląda na czystszy. Wykorzystanie składni strzałek z programowania funkcyjnego umożliwia zwracanie wartości bez słowa kluczowego break , a generalnie wynik wykonania przełącznika można teraz zapisać do zmiennej lub zwrócić przez return .

W przypadkach, gdy musisz nie tylko zwrócić wynik, ale także mieć kilka linii kodu, przełącznik będzie wyglądał następująco:


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

W Javie 13 wyrażenie przełączające nadal ma status funkcji eksperymentalnej i aby było dostępne do uruchomienia, tak jak w Javie 12, należy użyć polecenia --enable-preview do kompilacji i uruchomienia. Główną i w zasadzie jedyną „nowością” switcha w Javie 13 jest słowo kluczowe yield , które zastąpiło 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;
}

Główna różnica między yield a break polega na tym, że break zwraca sterowanie z przypadku - polecenie, gdy yield zwraca wynik z całego przełącznika , pełniąc rolę wewnętrznego zwrotu -a.

W Javie 14 operator instanceOf zmienił się i teraz można go używać w następujący sposób:


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

Zamiast starej i niezbyt pięknej wersji, gdzie oprócz sprawdzenia instanceOf konieczne jest również rzutowanie zmiennej na konkretny typ.


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

Zmiany te są częścią projektu Amber, którego celem jest dodanie obsługi dopasowywania wzorców do języka Java.

Dzięki zmianie operatora instanceOf w wersji 14 oraz rozszerzeniu w wersji 16, Pattern Matching zostało jednak dodane do wersji 17. To prawda, na razie tylko jako podgląd i możesz to przetestować za pomocą --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();
    };
}

Ogólnie rzecz biorąc, z każdą nową wersją w języku pojawia się coraz więcej interesujących funkcji programistycznych, co czyni Javę jeszcze fajniejszą.