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
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);
}
}
Comments