Jin's rambling

Some Java best practices from Effective Java

Noninstantiable utility class

public class UtilityClass {
   // Suppress default constructor for noninstantiability
   private UtilityClass() {
    throw new AssertionError();
  }
     ...  // Remainder omitted
}

Use static initializer when applicable

private static final Date BOOM_START;
private static final Date BOOM_END;
static {
   Calendar gmtCal =
       Calendar.getInstance(TimeZone.getTimeZone("GMT"));
   gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
   BOOM_START = gmtCal.getTime();
   gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
   BOOM_END = gmtCal.getTime();
}

Potential security hole!

   public static final Thing[] VALUES =  { ... };

Provide immutable copy instead

private static final Thing[] PRIVATE_VALUES = { ... };
   public static final List<Thing> VALUES =
       Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

Or use get with clone()

private static final Thing[] PRIVATE_VALUES = { ... };
   public static final Thing[] values() {
       return PRIVATE_VALUES.clone();
   }

Use private constructor to prevent instantiation in util and constant classes

 private PhysicalConstants() { } 

Constant-specific method implementation

 public enum Operation {
     PLUS   { double apply(double x, double y){return x + y;} },
     MINUS  { double apply(double x, double y){return x - y;} },
     TIMES  { double apply(double x, double y){return x * y;} },
     DIVIDE { double apply(double x, double y){return x / y;} };
     abstract double apply(double x, double y);
 }

String-to-enum code

// Implementing a fromString method on an enum type
 private static final Map<String, Operation> stringToEnum = new HashMap<String, Operation>();
 static { // Initialize map from constant name to enum constant
     for (Operation op : values())
         stringToEnum.put(op.toString(), op);
 }
 // Returns Operation for string, or null if string is invalid
 public static Operation fromString(String symbol) {
     return stringToEnum.get(symbol);
 }