I would like to use a switch statement, but I am not able to construct it without either duplicating code or using an accompanying if statement.  Is there a way around this?
I have 5 cases, and for all but one of them I would like to perform a certain action.  So with a switch statement, I can just do:
switch(x) {
case A:
    foo();
    break;
case B:
case C:
case D:
case E:
    bar();
    break;
}
Easy. But the difficulty comes in that I also need to perform another distinct action for each one, so I can't use the fall-through feature of the cases. So I'm reduced to either
switch(x) {
case A:
    foo();
    baz(0);
    break;
case B:
    bar();
    baz(1);
    break;
case C:
    bar();
    baz(2);
    break;
case D:
    bar();
    baz(3);
    break;
case E:
    bar();
    baz(4);
    break;
}
which smells to me because of having to repeat bar() every time, or
switch(x) {
case A:
    baz(0);
    break;
case B:
    baz(1);
    break;
case C:
    baz(2);
    break;
case D:
    baz(3);
    break;
case E:
    baz(4);
    break;
}
if (x != A) { bar(); }
which doesn't duplicate any code, but it bothers me that there I need to use both switch and if.
I guess one other alternative would be to use a map, like
Map<X, Integer> m = new HashMap<X, Integer>();
m.put(A, 0);
m.put(B, 1);
m.put(C, 2);
m.put(D, 3);
m.put(E, 4);
if (m.get(x) == 0) {
    foo();
} else {
    bar();
}
baz(m.get(x));
but now I've introduced a whole data structure just to clean this up. (And when you count the initialization of the map, it's not even that much cleaner.)
Any tips?
Is x by any chance an enum?  In which case just move the method to the enum instead of switching.
enum Employee {
    SENIOR {
        @Override
        public int salary() {
            return 60;
        }
    },
    JUNIOR {
         @Override
         public int salary() {
            return 40;
         }
    };
    public abstract int salary ();
}
And calling
  employee.salary();
Is much better than switching.
Yes; you will have to duplicate method calls, but I think this is correct and clear. Or... use a constructor in your enum. Excuse contrived mix of "Employee" code with "foobar" code.
   private final boolean flag;
   Employee(int flag) {
       this.flag = flag;
   }
   public int method() {
       if(flag) {
            secondMethod();
       }
       alwaysMethod();
   }
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With