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

Reply via email to