Java - enum valueOf "override" naming convention

Alin Stoian picture Alin Stoian · Oct 3, 2013 · Viewed 17.5k times · Source

Say you have the following enum:

public enum Color {
    RED("R"), GREEN("G"), BLUE("B");
    private String shortName;

    private Color(String shortName) {
        this.shortName = shortName;
    }

    public static Color getColorByName(String shortName) {
        for (Color color : Color.values()) {
            if (color.shortName.equals(shortName)) {
                return color;
            }
        }
        throw new IllegalArgumentException("Illegal color name: " + shortName);
    }
}

Since enum is a special case, when you cannot just override the valueOf function, what is the naming convention for circumventing this and implementing valueOf(String name)?

getColorByName(String name)
getValueOf(String name)
permissiveValueOf(String name)
customValueOf(String name)
forName(String name)
getEnum(String name)
getColor(String name)

Later Edit: I see that Bloch in Effective Java 2nd ed. proposes something in the lines of getInstance() (Chapter 1, Item 1). Just to add another option.

Answer

Guillaume Poussel picture Guillaume Poussel · Oct 6, 2013

You are definitely right, you cannot override Enum#valueOf() since it is a static method of Enum class.

I don't think there is a naming convention. As you have already pointed out, there are few examples in Java:

I won't use getEnum, since you are not getting the Enum itself, but rather a value. Using forName() is not appropriate here, R is not the name of the red color.

I would rather go with:

  • fromString() since it is an opposite to toString();
  • getColor() for consistency with Java Standard Library.