| This checker aims to improve the readability of new-style arrow `switch`es by |
| simplifying and refactoring them. |
| |
| ### Simplifications: |
| |
| * When a `case` consists only of a `yield`ing some value, it can be re-written |
| with just the value. For example, `case FOO -> { yield "bar"; }` can be |
| shortened to `case FOO -> "bar";` |
| * When a case has redundant braces around the right-hand side of the arrow, |
| they can be removed. For example, `case FOO -> { System.out.println("bar"); |
| }` can shortened to `case FOO -> System.out.println("bar");` |
| |
| ### Factoring out `return switch`: |
| |
| * When every value of an `enum` is covered by a `case` which `return`s, the |
| `return` can be factored out |
| |
| ``` {.bad} |
| enum SideOfCoin {OBVERSE, REVERSE}; |
| |
| private String renderName(SideOfCoin sideOfCoin) { |
| switch(sideOfCoin) { |
| case OBVERSE -> { |
| return "Heads"; |
| } |
| case REVERSE -> { |
| return "Tails"; |
| } |
| } |
| // This should never happen, but removing this will cause a compile-time error |
| throw new RuntimeException("Unknown side of coin"); |
| } |
| ``` |
| |
| The transformed code is simpler and elides the "should never happen" handler. |
| |
| ``` {.good} |
| enum SideOfCoin {OBVERSE, REVERSE}; |
| |
| private String renderName(SideOfCoin sideOfCoin) { |
| return switch(sideOfCoin) { |
| case OBVERSE -> "Heads"; |
| case REVERSE -> "Tails"; |
| }; |
| } |
| ``` |
| |
| * When switching on something other than an `enum`, if the `case`s are |
| exhaustive, then a similar refactoring can be performed. |
| |
| ### Factoring out assignment `switch`: |
| |
| * When every `case` just assigns a value to the same variable, the assignment |
| can potentially be factored out |
| * If a local variable is defined and then immediately overwritten by a |
| `switch`, the definition and assignment can potentially be combined |
| |
| ``` {.bad} |
| enum Suit {HEARTS, CLUBS, SPADES, DIAMONDS}; |
| |
| private void updateScore(Suit suit) { |
| int score = 0; |
| switch(suit) { |
| case HEARTS, DIAMONDS -> { |
| score = -1; |
| } |
| case SPADES -> { |
| score = 2; |
| } |
| case CLUBS -> { |
| score = 3; |
| } |
| } |
| } |
| ``` |
| |
| Which can be consolidated: |
| |
| ``` {.good} |
| enum Suit {HEARTS, CLUBS, SPADES, DIAMONDS}; |
| |
| private void updateScore(Suit suit) { |
| int score = switch(suit) { |
| case HEARTS, DIAMONDS -> -1; |
| case SPADES -> 2; |
| case CLUBS -> 3; |
| }; |
| } |
| ``` |