I think java enum are a nice addition to the language. I used to combine them with switch/case statements. But lately François, a colleague, shown we a better way :)
You can embedded behavior in each enumeration case, reducing client code and making it more elegant :)
Let's take a simple example: Every day of the week you need to do something: take out the garbage, go to the laundry etc. ...
Using switch here's how I would have done it:
private enum Week {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}
public static void main(String[] args) {
final Week today = getToday();
Action action;
switch (today) {
case Sunday:
action = new FamillyDiner();
break;
case Monday:
case Friday:
action = new Garbage();
break;
case Tuesday:
action = new Laundry();
break;
case Wednesday:
action = new ChillOut();
break;
case Thursday:
action = new Grocery();
break;
case Saturday:
action = new SoccerGame();
break;
default:
throw new RuntimeException("Impossible day!");
}
action.execute();
}
Conclusion:
- You can see the number of lines in main() is quite important
- The client code (the switch/case code) is likely to be duplicate
- There is an unnecessary case "default" that can never happen (even null case would result in a NullPointerException in the switch)
- But it still much better than a if/elseif/else using int
Adding behavior to the enum:
private enum Week {
Sunday {
@Override
public void execute() {
System.out.println("Mom and Dad diner.");
}
}, Monday {
@Override
public void execute() {
System.out.println("Take the garbage out.");
}
}, Tuesday {
@Override
public void execute() {
System.out.println("Do the laundry.");
}
}, Wednesday {
@Override
public void execute() {
System.out.println("Have a beer. Just Chill out!");
}
}, Thursday {
@Override
public void execute() {
System.out.println("Go out to the local store for Grocery with shoping list.");
}
}, Friday {
@Override
public void execute() {
System.out.println("Take the garbage out.");
}
}, Saturday {
@Override
public void execute() {
System.out.println("Manchester vs Arsenal! Can't miss that!");
}
};
public abstract void execute();
}
public static void main(String[] args) {
final Week today = getToday();
today.execute();
}
Conclusion:
- Less lines of code and still readable
- main() code is soooo easy
- No unnecessary case "default"
- If you don't want this behavior and still use the enum you are free to use the switch/case way
Clearly I think this approach is far better and much more elegant unless someone show me otherwise...
Download the complete code sample.