Java 25 продолжает развивать pattern matching: теперь в
instanceof и switch можно будет использовать примитивные типы!В чем была проблема?
Раньше pattern matching работал только с объектами:
if (obj instanceof String s) { ... }
А вот так было нельзя:
if (x instanceof int i) { ... } // Ошибка
То же самое со
switch — примитивы были ограничены: нельзя было использовать switch на boolean, float, double, long или с примитивными паттернами.Что добавили?
Теперь можно будет:
Использовать примитивы в
instanceof:
if (num instanceof byte b) { ... } // Автоматически проверит, влезает ли num в byte
Писать switch по boolean, long, float, double:
switch (flag) {
case true -> System.out.println("Да");
case false -> System.out.println("Нет");
}
Использовать примитивные паттерны в
switch:
switch (value) {
case 0 -> System.out.println("Ноль");
case int i when i > 0 -> System.out.println("Положительное: " + i);
}
Почему это круто?
– упрощаются безопасные преобразования типов без ручных проверок диапазонов.
– убираются лишние
if перед кастами.–
switch будет действительно универсальным: можно будет свитчить по любым типам.– можно будет использовать примитивы в
record-паттернах и instanceof так же просто, как объекты.Пример:
Допустим, есть JSON:
sealed interface JsonValue { ... }
record JsonNumber(double d) implements JsonValue { }
Раньше:
if (json instanceof JsonNumber(double d)) {
int age = (int) d; // Ручной каст, возможна потеря данных
}
С Java 25:
if (json instanceof JsonNumber(int age)) {
System.out.println("Возраст: " + age);
}
// Сработает только если double без потери вмещается в int
Зачем это добавили?
Паттерны должны быть едиными как для объектов, так и для примитивов. Это делает язык мощнее, проще, безопаснее
Java 25 умеет проверять и безопасно преобразовывать примитивы прямо в
instanceof и switch.Как вам новая фича? Предлагаем обсудить комментариях👇
