避免使用循環進行驗證。
我建議使用valueOf
。此方法內置枚舉,並可能考慮編譯時優化。
這將類似於實現靜態Map<String,EnumType>
來優化查找,您可以採取其他考慮。
缺點是您必須使用異常處理機制來捕獲非枚舉值。
例
public enum DataType {
//...
static public boolean has(String value) {
if (value== null) return false;
try {
// In this implementation - I want to ignore the case
// if you want otherwise ... remove .toUpperCase()
return valueOf(value.toUpperCase());
} catch (IllegalArgumentException x) {
// the uggly part ...
return false;
}
}
}
也要注意,使用上述類型的實現,要求當你的代碼看起來清爽多了。你的主現在看起來像這樣:
public void main(){
String filter = "SIZE";
String action = "DELETE";
// ...
if (Filter.has(filter) && Action.has(action)) {
// Appropriate action
}
}
然後另一個提到的選項是使用靜態地圖。您也可以使用這種方法來緩存基於其他屬性的所有類型的索引。在下面的例子中,我允許每個枚舉值都有一個別名列表。在這種情況下查找索引將不區分大小寫,強制轉換爲大寫。
public enum Command {
DELETE("del","rm","remove"),
COPY("cp"),
DIR("ls");
private static final Map<String,Command> ALIAS_MAP = new HashMap<String,Command>();
static {
for (Command type:Command.values()) {
ALIAS_MAP.put(type.getKey().toUpper(),type);
for (String alias:type.aliases) ALIAS_MAP.put(alias.toUpper(),type);
}
}
static public boolean has(String value) {
return ALIAS_MAP.containsKey(value.toUpper());
}
static public Command fromString(String value) {
if (value == null) throw new NullPointerException("alias null");
Command command = ALIAS_MAP.get(value);
if (command == null) throw new IllegalArgumentException("Not an alias: "+value);
return command;
}
private List<String> aliases;
private Command(String... aliases) {
this.aliases = Arrays.asList(aliases);
}
}
你說對了:)枚舉只是一個普通的類,你可以不提它的名字那樣。枚舉是他們枚舉的實例,而不是整個枚舉。 – 2012-04-17 21:31:59