IntelliJ IDEA
IntelliJ IDEA – the Leading Java and Kotlin IDE, by JetBrains
Java 12 and IntelliJ IDEA
With switch expressions, Java 12 is enhancing one of its basic language constructs – switch
– to improve everyday coding experience for developers. Benefits are multi-fold. As compared to the ‘traditional’ switch constructs, switch expressions can return a value. The ability to define multiple constants with a switch branch, and improved code semantics, makes it concise. By removing default fall-through switch branches, you are less likely to introduce a logical error in a switch expression.
In this blog, we’ll cover the pain points of using existing switch statements, define switch expressions, and explain why they are good for you.
To use Switch Expressions, we’ll need IntelliJ IDEA 2019.1. It is free to download in its Early Access Program from our website. Java 12 language features are not supported in 2018.3 or earlier versions of IntelliJ IDEA. Let’s get started.
Traditional switch constructs
If you think of a switch construct as a multi-way condition, using an expression seems to be a better fit. However, switch could only be used as a statement until now. The current switch syntax is constrained and verbose. It often leads to error-prone code that is difficult to debug.
Here’s an example that uses a switch statement to calculate the height
of a chair, based on the size
value passed to it:
public enum Size {S, M, L, XL}; public class Chair { public void calcHeight(Size size) { int height = 0; switch (size) { case S: height = 18; case M: height = 20; break; case L: height = 25; break; } } }
The preceding code has multiple issues:
- Repetitive
break
and assignment statements add noise to code. - Code verbosity makes it difficult to comprehend the code.
- Default fall-through in switch branches sneaks in a logical error – the missing
break
statement for case labelS
lets the control fall through to case labelM
. This results in assignment of 20 instead of 18 toheight
when you executecalcHeight(Size.S)
.
Switch expressions
Let’s rewrite the preceding example using a switch expression. In IntelliJ IDEA, you can use Alt+Enter on the switch
keyword to see the suggestions. Select ‘Replace with enhanced ‘switch’ statement’ to convert the traditional switch
statement to a switch expression:
The preceding code offers multiple benefits:
- Code in a switch branch is concise and easy to read. You define what to execute to the right of
->
. - Switch branches can return a value, which can be used to assign value to a variable.
- Switch branches don’t need a
break
statement to mark their end. In absence of abreak
statement, the control doesn’t fall through the switch labels – which helps avoid logical errors.
Returning value vs. executing statements
When you aren’t using a switch expression to return a value, a switch branch can choose to execute a statement or block of statements, or even throw an exception:
public enum Size {S, M, L, XL}; public class NotReturningValueFromSwitchLabel { public void calcHeight(Size size) { int height = 0; switch (size) { case S -> height = 18; case M -> { height = 20; System.out.println(height); } case L -> height = 25; } } }
Handling all possible argument values
When you are using a switch expression to return a value, it should be able to handle all possible values that you could pass to it as an argument. For instance, if you miss a case label corresponding to an enum constant, IntelliJ IDEA detects it. It offers to insert the specific case label or default
case label.
By default, IntelliJ IDEA inserts a default value depending on the variable type. You can edit the placeholder value:
Types other than an enum can have infinite values. When you pass types like byte
, short
, int
, or String
and miss including the default
label, IntelliJ IDEA can detect and fix it:
Define multiple constants in the same case label
Unlike switch statements, switch expressions allow you to define comma-separated multiple constants in a case label. This cuts down code redundancy – you can execute the same code for all case labels.
If you define redundant code for your case labels in a switch expression, IntelliJ IDEA can fix it for you:
Local variables and break statements in switch branches
With switch expressions, you can define local variables in switch branches. The block must include a break
statement specifying the value to return:
enum Size {S, M, L, XL}; public class LocalVariablesWithSwitch { public void assignValue(Size size) { int height = 0; height = switch(size) { case S -> 18; case M -> { int weight = 19; break (weight > 10 ? 15 : 20); } case L, XL -> 25; }; } }
The case label for value M defines a block statement. A block can also define local variables (weight in this case). The scope and accessibility of the local variable weight
is limited to the case label M. Notice how a switch expression uses a break
statement to return a value.
Just in case you miss defining a return value for a switch branch, IntelliJ IDEA underlines the keyword case
. When you hover the mouse pointer over it, you can view the message about the missing return value:
Preview language feature
Switch expressions is a preview language feature. This essentially means that even though it is complete, it has a possibility of not being confirmed as a permanent feature in a future Java release. This happens for a reason.
Java runs on billions of devices and is used by millions of developers. Risks are high for any mistake in a new Java language feature. Before permanently adding a language feature to Java, the architects of Java evaluate what the developers have to say about it – how good or bad it is. Depending on the feedback, a preview feature might be refined before it’s added to Java SE, or dropped completely. So, if you have any feedback on Switch expressions, please share it here.
IntelliJ IDEA Configuration
Since Switch expressions is a Java 12 language feature, please download and install OpenJDK 12 and configure it to use with IntelliJ IDEA:
Java is evolving and switch expressions is one of the welcome changes in Java 12.
Happy Coding!