Evolução do "switch case" do Java 8 ao Java 21 🎯

Lorena Gomes - Oct 12 - - Dev Community

O switch é muito utilizado quando você precisa comparar um conjunto fixo e pequeno de valores, especialmente se forem valores constantes como String, Enum, ou classes seladas.
Além disso, ele é ideal para melhorar a legibilidade do código e pode oferecer vantagens de desempenho em relação ao if-else, dependendo do número de casos.

O uso do switch em Java evoluiu bastante desde a versão 8. Vou destacar as principais mudanças e melhorias introduzidas ao longo do tempo.

Java 8 (2014)

O switch era bem limitado e suportava apenas tipos primitivos como int, char, byte, short e suas respectivas classes wrapper (Integer, Character, etc.). Além disso, switch podia ser usado com Enum e String (introduzido no Java 7).

int day = 2;
switch (day) {
    case 1:
        System.out.println("Sunday");
        break;
    case 2:
        System.out.println("Monday");
        break;
    default:
        System.out.println("Invalid day");
}
Enter fullscreen mode Exit fullscreen mode

O uso de break era obrigatório para evitar o fall-through (a execução continuava para o próximo caso, se o break fosse omitido).
O switch era usado apenas como declaração (statement), ou seja, ele não podia retornar diretamente valores.


Java 12 (2019)

Nessa versão o Java introduziu o conceito de switch expressions como uma funcionalidade experimental (preview), permitindo que o switch fosse usado tanto como declaração (statement) quanto como expressão. Isso trouxe duas grandes mudanças:

Setas (->): A sintaxe usando setas foi introduzida para substituir o uso do break, tornando o código mais conciso e legível.

Retorno de valor: Agora era possível retornar diretamente valores de um switch, transformando-o em uma expressão.

int day = 2;
String dayName = switch (day) {
    case 1 -> "Sunday";
    case 2 -> "Monday";
    case 3 -> "Tuesday";
    default -> "Invalid day";
};
System.out.println(dayName);  

// Output: Monday
Enter fullscreen mode Exit fullscreen mode

Java 13 (2019)

O switch expressions continuou em modo preview, mas teve algumas melhorias. Agora, além da sintaxe com setas, era possível usar o yield para retornar valores, mesmo nas versões tradicionais (com blocos de código em vez de apenas setas).
O uso do yield foi necessário para permitir que blocos de código maiores pudessem ser usados dentro dos casos sem comprometer a clareza.

int day = 3;
String dayName = switch (day) {
    case 1: 
        yield "Sunday";
    case 2: 
        yield "Monday";
    case 3: 
        yield "Tuesday";
    default: 
        yield "Invalid day";
};
System.out.println(dayName);  

// Output: Tuesday
Enter fullscreen mode Exit fullscreen mode

Java 14 (2020)

O switch expression saiu do modo preview e se tornou uma funcionalidade padrão, disponível para todos os desenvolvedores. Agora, além das melhorias de sintaxe e uso de yield, essa forma de switch passou a ser considerada estável e recomendada para casos que exigem retornos de valor.


Java 17 (2021)

O switch passou por melhorias adicionais para suportar novos tipos de dados e ser ainda mais flexível:

Suporte para classes seladas: O switch agora é otimizado para trabalhar com classes seladas (sealed classes), o que facilita a correspondência exata de tipos específicos.

Melhoria no tratamento de null: Agora é possível tratar explicitamente o valor null dentro de um switch, algo que antes gerava um erro de compilação.

sealed interface Shape permits Circle, Rectangle {}

final class Circle implements Shape {
    double radius;
}

final class Rectangle implements Shape {
    double width, height;
}

Shape shape = new Circle();

String result = switch (shape) {
    case Circle c -> "Circle with radius " + c.radius;
    case Rectangle r -> "Rectangle with width " + r.width + " and height " + r.height;
};
System.out.println(result);
Enter fullscreen mode Exit fullscreen mode
String input = null;
String result = switch (input) {
    case null -> "Null value";
    case "Hello" -> "Greeting";
    case "Bye", "Byebye" -> "See you tomorrow!"
    default -> "Unknown input";
};
System.out.println(result);  

// Output: Null value
Enter fullscreen mode Exit fullscreen mode

Java 20 (2023)

Houve o aperfeiçoamentos nas expressões de padrões, permitindo o uso do switch com padrões para fazer correspondências mais ricas e tipadas.
E a grande novidade foi a introdução de pattern matching no switch, ainda como recurso preview, permitiu usar padrões mais complexos com a capacidade de testar tipos.

static String formatterPatternSwitch(Object obj) {
    return switch (obj) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> obj.toString();
    };
}

Enter fullscreen mode Exit fullscreen mode

Java 21 (2023)

Agora finalizado o pattern matching está disponível como recurso padrão no Java 21. Ele expande o uso do switch com a capacidade de combinar padrões de tipos diretamente nas expressões.
Nessa versão o compilador atua diretamente garantindo que todos os ramos de um switch que usa pattern matching sejam cobertos, reduzindo a chance de erros em tempo de execução.

public static String formatObject(Object obj) {
    return switch (obj) {
        case Integer i -> "It's an integer: " + i;
        case String s  -> "It's a string: " + s;
        case null      -> "It's null!";
        default        -> "It's another type: " + obj.toString();
    };
}

Enter fullscreen mode Exit fullscreen mode

Realmente foram muitas mudanças ao longo das versões, o que torna o switch ainda mais atrativo.

Nos resta nos atualizar, colocar no código e aproveitar! 👩‍💻

. .
Terabox Video Player