首页 > 解决方案 > 查找 String 是否不在 ENUM 列表中的最佳方法

问题描述

String如果给定不在列表中,我需要查找ENUMs

这些Strings以空格返回,即:“儿童护理”、“信用卡”等...

任何其他ExpenseType都应该映射到OTHER,除了HOAHOA应该完全忽略。

我的枚举如下:

public enum ExpenseType {
    AUTOLOAN("AUTO LOAN"),
    ALIMONY("ALIMONY"),
    CHILDCARE("CHILD CARE"),
    CREDITCARDS("CREDIT CARDS"),
    INSTALLMENTLOANS("INSTALLMENT LOANS"),
    FOOD("FOOD"),
    UTILITIES("UTILITIES"),
    TRANSPORTATION("TRANSPORTATION"),
    OTHER("OTHER");

    private String expenseType; 
    ExpenseType(String expenseType) {
        this.expenseType = expenseType;
    }   
    @Override public String toString() {
        return this.expenseType;
    }
}

我现在这样做的方式如下:

String expenseDescription = expense.getExpenseDesc().replaceAll(" ", "");
if(EnumUtils.isValidEnum(ExpenseType.class, expenseDescription)) {
    monthlyExpenses.setType(ExpenseType.valueOf(expenseDescription).toString());
} 
else if(!expenseDescription.equals("HOA")) {
   monthlyExpenses.setType(ExpenseType.OTHER.toString());
}

有谁知道更好的方法来做到这一点?

标签: javaenums

解决方案


如果适用,为什么不使用getEnum来获取 Enum(检查 null 或在需要时使用 Optional)

ExpenseType monthlyExpenses = EnumUtils.getEnum(ExpenseType.class, expenseDescription);

获取类的枚举,如果找不到则返回 null。

此方法与 Enum.valueOf(java.lang.Class, java.lang.String) 的不同之处在于它不会为无效的枚举名称引发异常。

也更喜欢在枚举中添加一个代码(字符串)作为参考,它不包含空格和特殊字符,例如

//...
CHILDCARE("CHILD_CARE","CHILD CARE"),
//...
private String expenseType; 
private String expenseTypeCode; 
ExpenseType(String expenseType, String expenseTypeCode) {
    this.expenseType = expenseType;
    this.expenseTypeCode = expenseTypeCode;
}   

推荐阅读