In my code, the program does something depending on the text entered by the user. My code looks like:
switch (name) {
case text1: {
//blah
break;
}
case text2: {
//blah
break;
}
case text3: {
//blah
break;
}
case text4: {
//blah
break;
}
However, the code inside cases text1
and text4
is the same. I was therefore wondering if it would be possible for me to implement something like
case text1||text4: {
//blah
break;
}
I know that the ||
operator won't work in the case statement but is there something similar I can use.
This question is related to
java
switch-statement
you can do like:
case text1:
case text4: {
//blah
break;
}
The case values are just codeless "goto" points that can share the same entry point:
case text1:
case text4: {
//Do something
break;
}
Note that the braces are redundant.
The fallthrough
answers by others are good ones.
However another approach would be extract methods out of the contents of your case statements and then just call the appropriate method from each case.
In the example below, both case 'text1' and case 'text4' behave the same:
switch (name) {
case text1: {
method1();
break;
}
case text2: {
method2();
break;
}
case text3: {
method3();
break;
}
case text4: {
method1();
break;
}
I personally find this style of writing case statements more maintainable and slightly more readable, especially when the methods you call have good descriptive names.
Just do
case text1: case text4:
do stuff;
break;
Fall through approach is the best one i feel.
case text1:
case text4: {
//Yada yada
break;
}
The brackets are unnecessary. Just do
case text1:
case text4:
doSomethingHere();
break;
case text2:
doSomethingElse()
break;
If anyone is curious, this is called a case fallthrough. The ability to do this is the reason why break;
is necessary to end case statements. For more information, see the wikipedia article http://en.wikipedia.org/wiki/Switch_statement.
You can use:
case text1: case text4:
do stuff;
break;
switch (name) {
case text1, text4 -> // do something ;
case text2, text3, text 5 -> // do something else ;
default -> // default case ;
}
You can also assign a value through the switch case expression :
String text = switch (name) {
case text1, text4 -> "hello" ;
case text2, text3, text5 -> "world" ;
default -> "goodbye";
};
It allows you to return a value by the switch case expression
String text = switch (name) {
case text1, text4 ->
yield "hello";
case text2, text3, text5 ->
yield "world";
default ->
yield "goodbye";
};
JEP 354: Switch Expressions (Preview) in JDK-13 and JEP 361: Switch Expressions (Standard) in JDK-14 will extend the switch statement so it can be used as an expression.
Now you can:
case L ->
):
The code to the right of a "case L ->" switch label is restricted to be an expression, a block, or (for convenience) a throw statement.
To yield a value from a switch expression, the
break
with value statement is dropped in favor of ayield
statement.
So the demo from one of the answers might look like this:
public class SwitchExpression {
public static void main(String[] args) {
int month = 9;
int year = 2018;
int numDays = switch (month) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9, 11 -> 30;
case 2 -> {
if (java.time.Year.of(year).isLeap()) {
System.out.println("Wow! It's leap year!");
yield 29;
} else {
yield 28;
}
}
default -> {
System.out.println("Invalid month.");
yield 0;
}
};
System.out.println("Number of Days = " + numDays);
}
}
With the integration of JEP 325: Switch Expressions (Preview) in JDK-12 early access builds, one can now make use of the new form of the switch label as :-
case text1, text4 -> {
//blah
}
or to rephrase the demo from one of the answers, something like :-
public class RephraseDemo {
public static void main(String[] args) {
int month = 9;
int year = 2018;
int numDays = 0;
switch (month) {
case 1, 3, 5, 7, 8, 10, 12 ->{
numDays = 31;
}
case 4, 6, 9, 11 ->{
numDays = 30;
}
case 2 ->{
if (((year % 4 == 0) &&
!(year % 100 == 0))
|| (year % 400 == 0))
numDays = 29;
else
numDays = 28;
}
default ->{
System.out.println("Invalid month.");
}
}
System.out.println("Number of Days = " + numDays);
}
}
Here is how you can give it a try - Compile a JDK12 preview feature with Maven
The case
values are just codeless "goto" points that can share the same entry point:
case text1:
case text4:
//blah
break;
Note that the braces are redundant.
Source: Stackoverflow.com