This question is basically an extension of my previous question . I asked the previous question to be sure that the Enum constants are populated when the class loads . Here’s is my class again with the addition of a simple method getByName :
public enum PropName {
CONTENTS("contents"),
USE_QUOTES("useQuotes"),
ONKEYDOWN("onkeydown"),
BROWSER_ENTIRE_TABLE("browseEntireTable"),
COLUMN_HEADINGS("columnHeadings"),
PAGE_SIZE("pageSize"),
POPUP_TITLE("popupTitle"),
FILTER_COL("filterCol"),
SQL_SELECT("sqlSelect"),
;
private String name;
private PropName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static PropName getByName(String name){
return PropName.valueOf(name);
}
}
A call to the method getByName("columnHeadings") is throwing java.lang.IllegalArgumentException: No enum const class labware.web.component.limsgrid.PropName.columnHeadings but if I replace this method with the following code it just works .
public static PropName getByName(String name){
for(PropName prop : values()){
if(prop.getName().equals(name)){
return prop;
}
}
throw new IllegalArgumentException(name + " is not a valid PropName");
}
Any ideas as to what I am doing wrong here ?
Enum.valueOf()only checks the constant name, so you need to pass it"COLUMN_HEADINGS"instead of “columnHeadings”. Yournameproperty has nothing to do with Enum internals.To address the questions/concerns in the comments:
The enum’s “builtin” (implicitly declared)
valueOf(String name)method will look up an enum constant with that exact name. If your input is “columnHeadings”, you have (at least) three choices:enum PropName { contents, columnHeadings, ...}. This is obviously the most convenient.valueOf, if you’re really fond of naming conventions.valueOfto find the corresponding constant for an input. This makes most sense if there are multiple possible mappings for the same set of constants.