Override valueof() and toString() in Java enum Override valueof() and toString() in Java enum java java

Override valueof() and toString() in Java enum


You can try out this code. Since you cannot override valueOf method you have to define a custom method (getEnum in the sample code below) which returns the value that you need and change your client to use this method instead.

public enum RandomEnum {    StartHere("Start Here"),    StopHere("Stop Here");    private String value;    RandomEnum(String value) {        this.value = value;    }    public String getValue() {        return value;    }    @Override    public String toString() {        return this.getValue();    }    public static RandomEnum getEnum(String value) {        for(RandomEnum v : values())            if(v.getValue().equalsIgnoreCase(value)) return v;        throw new IllegalArgumentException();    }}


Try this, but i don't sure that will work every where :)

public enum MyEnum {    A("Start There"),    B("Start Here");    MyEnum(String name) {        try {            Field fieldName = getClass().getSuperclass().getDeclaredField("name");            fieldName.setAccessible(true);            fieldName.set(this, name);            fieldName.setAccessible(false);        } catch (Exception e) {}    }}


You can use a static Map in your enum that maps Strings to enum constants. Use it in a 'getEnum' static method. This skips the need to iterate through the enums each time you want to get one from its String value.

public enum RandomEnum {    StartHere("Start Here"),    StopHere("Stop Here");    private final String strVal;    private RandomEnum(String strVal) {        this.strVal = strVal;    }    public static RandomEnum getEnum(String strVal) {        if(!strValMap.containsKey(strVal)) {            throw new IllegalArgumentException("Unknown String Value: " + strVal);        }        return strValMap.get(strVal);    }    private static final Map<String, RandomEnum> strValMap;    static {        final Map<String, RandomEnum> tmpMap = Maps.newHashMap();        for(final RandomEnum en : RandomEnum.values()) {            tmpMap.put(en.strVal, en);        }        strValMap = ImmutableMap.copyOf(tmpMap);    }    @Override    public String toString() {        return strVal;    }}

Just make sure the static initialization of the map occurs below the declaration of the enum constants.

BTW - that 'ImmutableMap' type is from the Google guava API, and I definitely recommend it in cases like this.


EDIT - Per the comments:

  1. This solution assumes that each assigned string value is unique and non-null. Given that the creator of the enum can control this, and that the string corresponds to the unique & non-null enum value, this seems like a safe restriction.
  2. I added the 'toSTring()' method as asked for in the question