Disallowing break label (and continue label) inside an expression switch
Guy Steele
guy.steele at oracle.com
Fri Mar 23 20:51:22 UTC 2018
String s = switch (e) {
case 0 -> break “foofoo”;
case 1:
if (p == 0) break x;
else { String z = hairy(x); break z+z; }
case 2 -> “barbar”;
};
Now I decide that case 1 has three subcases. So I change the `if` to a statement `switch`.
String s = switch (e) {
case 0 -> break “foofoo”;
case 1:
switch (p) {
case 0: break x;
case 1: break x+x;
default: String z = hairy(x); break z+z;
}
case 2 -> “barbar”;
};
FAIL.
One can argue that I should have done something else, such as use a three-way if-then-else:
String s = switch (e) {
case 0 -> break “foofoo”;
case 1:
if (p == 0) break x;
else if (p == 1) break x+x;
else { String z = hairy(x); break z+z; }
case 2 -> “barbar”;
};
or use a switch expression rather than a statement switch:
String s = switch (e) {
case 0 -> break “foofoo”;
case 1 ->
switch (p) {
case 0 -> x;
case 1 -> x+x;
default: String z = hairy(x); break z+z;
}
case 2 -> “barbar”;
};
All I’m doing is demonstrating that a common refactoring pattern “turn the `if` statement into a `switch` statement” has more pitfalls than it used to once we introduce `switch` expressions.
—Guy
More information about the amber-spec-experts
mailing list