Буквально полгода назад я писал про новые возможности в Java 11. Теперь уже доступна Java 12.
По большому счёту ничего особо знаменательного нам этот релиз не принёс. Большая часть изменений внутренняя: модификации различных сборщиков мусора, редко используемые в работе вещи и прочие мелкие улучшения. Единственная полезное для нас нововведение — это Switch Expressions, но даже она вошла как Preview. Планировали ещё ввести Raw Strings, но его отложили.
Switch Expressions (Preview)
Как мы раньше писали switch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class Main { public static void main(String[] args) { int moneyType = 3; String moneyDescription; switch (moneyType) { case 1: case 2: moneyDescription = "Gold"; break; case 3: moneyDescription = "Aden"; break; case 4: case 5: moneyDescription = "Dollar"; break; default: moneyDescription = "Septim"; } System.out.println("moneyDescription = " + moneyDescription); } } |
Скомпилируем и запустим код (начиная с Java 9 для запуска программ, состоящих из одного файла, не обязательно запускать отдельно компилятор):
1 2 |
$ java Main.java moneyDescription = Aden |
Теперь перепишем тот же код с использованием Switch Expressions:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class MainSwitchExpression { public static void main(String[] args) { int moneyType = 3; String moneyDescription; switch (moneyType) { case 1, 2 -> moneyDescription = "Gold"; case 3 -> moneyDescription = "Aden"; case 4, 5 -> moneyDescription = "Dollar"; default -> moneyDescription = "Septim"; }; System.out.println("moneyDescription = " + moneyDescription); } } |
Теперь скомпилируем и запустим код. По умолчанию Switch Expressions отключены, так как это preview возможность. Компилировать нужно с ключём --enable-preview --release 12:
1 2 3 4 5 6 |
$ javac --enable-preview --release 12 MainSwitchExpression.java Note: MainSwitchExpression.java uses preview language features. Note: Recompile with -Xlint:preview for details. $ java --enable-preview MainSwitchExpression moneyDescription = Aden |
Можно ещё уменьшить количество кода, так как сам switch теперь возвращает значение:
1 2 3 4 5 6 7 8 9 10 11 12 |
public class MainSwitchExpression { public static void main(String[] args) { int moneyType = 3; String moneyDescription = switch (moneyType) { case 1, 2 -> "Gold"; case 3 -> "Aden"; case 4, 5 -> "Dollar"; default -> "Septim"; }; System.out.println("moneyDescription = " + moneyDescription); } } |
Запуск и результат будут такими же, как и у примера выше.
Можно также использовать break <значение>, чтобы возвращать значение из оператора switch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class MainSwitchBreakWithValue { public static void main(String[] args) { int moneyType = 3; String moneyDescription = switch (moneyType) { case 1: case 2: System.out.println("Some text"); break "Gold"; case 3: break "Aden"; case 4: case 5: break "Dollar"; default: break "Septim"; }; System.out.println("moneyDescription = " + moneyDescription); } } |
Запуск и результат будут такими же:
1 2 3 4 5 6 |
C:\Users\Fedor_Urvanov\Documents\test-java>C:\Users\Fedor_Urvanov\programs\jdk-12\bin\javac --enable-preview --release 12 MainSwitchBreakWithValue.java Note: MainSwitchBreakWithValue.java uses preview language features. Note: Recompile with -Xlint:preview for details. C:\Users\Fedor_Urvanov\Documents\test-java>C:\Users\Fedor_Urvanov\programs\jdk-12\bin\java --enable-preview MainSwitchBreakWithValue moneyDescription = Aden |