Java匹配字符串值到枚举,每个枚举值具有多个字符串匹配可能性

时间:2012-03-19 14:57:44

标签: java

鉴于此枚举:

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”,我可以在枚举中指定这两个吗?我想将这些保留在枚举中,而不是在枚举之外执行映射。

希望有意义,感谢任何想法

5 个答案:

答案 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可以通过fileAthe 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;
}