Domanda

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.

È stato utile?

Soluzione

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.

Altri suggerimenti

Do consider the following as well!

Color fromName(String name);
Color fromShortName(String shortName);
Color fromCode(String code);

I would use the pair:

Color fromValue(String value)
String toValue()

This is something that I've found most suitable in my enums.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top