Friday, November 30, 2012

Different ways to use enum's in java


Technique: Simple enum and retrieve/reverse lookup using valueOf()

public class OrderService {
    // Note : enums can be defined in its own file or inside a class if they are only relevant with it.
    public enum Status { PROCESSING, SHIPPED, COMPLETED; }

    public void update(long orderId, Status status) {
         // something
    }
}
// import static OrderService.Status;
// import static OrderService.Status.* ;
// OrderService service = new OrderService();
// service.update(100L, SHIPPED); // use enum
// Status status = Status.valueOf("SHIPPED"); // reverse lookup by constant, throws IllegalArgumentException if no match.
// System.out.println ( status.toString() ); // prints value - SHIPPED


Technique: Stores enum constant and value in a map, retrieve/reverse lookup using fromValue()


public enum Status {

        PROCESSING("processing"), SHIPPED("shipping"), COMPLETED("completed");
     
        private String val;
        private Status(String val) {
            this.val = val;
        }
        private static Map map = new HashMap<>();
        static {
            for ( Status status : values()) {
                map.put(status.val, status);
            }
        }
        static Status fromValue(String val) {
            return map.get(val);
        }
    }




Technique: fromValue() returns default enum for no match.

public enum Status {
   PROCESSING, SHIPPED, COMPLETED, UNRECOGNIZED;
   public static Status fromValue(String status) {
      try {
         Status status = valueOf(status);
         return status;
      } catch (IllegalArgumentException e) {
         return UNRECOGNIZED;
      }
   }
}

Technique: loop every time fromValue() is called

   public enum Status {

        PROCESSING(1), SHIPPED(2), COMPLETED(3);
        
        int val;
        Status(val) { this.val = val }

        static Status fromValue(int val) {
            // iterate and match value
            // If this block is executed a ton of times its better to use Map from the above technique.
            for (int s : Status.values()) {
                if (s == val ) {
                    return s;
                }
            }
            // throw exception or return a default enum or return null
            throw new IllegalArgumentException(val);
        }
    }