鉴于此枚举:
public enum FileTypes {
FILEA, FILEB, FILEC;
}
假设您想查看String值是否与3个枚举类型中的一个匹配,我有这个方法:
public static boolean validFileType(String value) {
for (FileTypes fileTypes : FileTypes.values()) {
if (fileTypes.name().equals(value)) {
return true;
}
}
return false;
}
工作正常,现在我想稍微改变一下。我可以添加多个字符串以匹配单个枚举吗?假设String值是“FILEA”或“example-file”,我可以在枚举中指定这两个吗?我想将这些保留在枚举中,而不是在枚举之外执行映射。
希望有意义,感谢任何想法
答案 0 :(得分:2)
您应该在枚举中添加字段,然后实现自己的valueOf()
方法。请查看提供更多详细信息的文章:http://java.dzone.com/articles/enum-tricks-customized-valueof
答案 1 :(得分:2)
您可以将有效条目添加到枚举构造函数中,如下所示:
public enum FileTypes {
FILEA("example_file"), //2 valid types
FILEB("example2", "example3"), //3 valid types
FILEC(); //Only "FILEC" is valid
FileTypes(String... otherValidEntries) {
this.validEntries.add(this.toString()); //I assume that the name of the enum is valid
this.validEntries.addAll(Arrays.asList(otherValidEntries));
}
private List<String> validEntries = new ArrayList<String>();
public static boolean isValidFileType(String value) {
for (FileTypes fileTypes : FileTypes.values()) {
if (fileTypes.validEntries.contains(value)) {
return true;
}
}
return false;
}
}
使用示例:
public static void main(String[] args) {
System.out.println(FileTypes.isValidFileType("FILEA")); //true
System.out.println(FileTypes.isValidFileType("FILEB")); //true
System.out.println(FileTypes.isValidFileType("example2")); //true
System.out.println(FileTypes.isValidFileType("example3")); //true
System.out.println(FileTypes.isValidFileType("FILEC")); //true
System.out.println(FileTypes.isValidFileType("example4")); //false
}
答案 2 :(得分:0)
是
Map<String, FileTypes> map = new HashMap<>();
map.put("FILEA", FileTypes.FILEA);
map.put("example-file", FileTypes.FILEA);
boolean validFileType(String value) {
return map.containsKey(value);
}
你明白了......如果你想将有效的“值”与它们的枚举紧密结合,你可以像这样创建枚举:
public enum FileTypes {
FILEA("FILEA", "example-file"),
FILEB("FILEB"),
FILEC("FILEC");
private final List<String> values;
private FileTypes(String... values) {
this.values = Arrays.asList(values);
}
public boolean validFileType(String value) {
return values.contains(value);
}
}
答案 3 :(得分:0)
public enum FileTypes {
FILEA(Arrays.asList("fileA", "the first one")),
FILEB(Arrays.asList("fileB")),
FILEC(Arrays.asList("fileC"));
private final Collection<String> val;
private FileTypes(Collection<String> val) {
this.val = val;
}
public static FileTypes findByValue(String val) {
for (FileTypes ft : values()) {
if (ft.val.contains(val)) {
return ft;
}
}
throw new IllegalArgumentException("There's no such file type identified by " + val);
}
}
FILEA
可以通过fileA
或the first one
找到:
System.out.println("file a: " + FileTypes.findByValue("fileA"));
System.out.println("file a: " + FileTypes.findByValue("the first one"));
答案 4 :(得分:0)
您可以在枚举中添加字段:
public enum FileTypes
{
FILEA("FILEA"), FILEB("FILEB", "file_b"), FILEC("FILEC", "file_c", "File of type C", "C_FILE");
private String[] aliases;
private FileTypes(String... aliases){
this.aliases = aliases;
}
public boolean equals(String string){
for(int i = 0; i < aliases.length; i++){
if(aliases[i].equals(string)){
return true;
}
}
return false;
}
}
然后:
public static boolean validFileType(String value) {
for (FileTypes fileType : FileTypes.values()) {
if (fileTypes.equals(value)) {
return true;
}
}
return false;
}