在Java中使用ENUMS验证值组合的最佳方法是什么?

时间:2012-12-09 15:01:48

标签: java validation enums

我通过定义如下的ENUM来验证从DB检索到的记录的状态

public enum RecordStatusEnum {
    CREATED("CREATED"),
    INSERTED("INSERTED"),   
    FAILED("FAILED");

private String recordStatusValue;

    RecordStatusEnum (String status) {
        recordStatusValue= status;
    }

    public boolean isSuccess() {
        return (this.equals(CREATED) || this.equals(INSERTED));
    }

}

方法isSuccess()用于检查检索到的记录的状态(来自员工的列状态)

if (!(employee.getStatus().isSuccess())) {
            // return error
        }

根据新要求,有一套条件,如A,B和C;对于他们来说,Employee表'条件'中有一列。

所以我需要检索状态和条件,看看它是否属于具有两者组合的集合。

例如:isSuccess()应检查以下内容:

CREATED and A 
CREATED and B
INSERTED and C

必须实现这一点,以便我可以轻松地在列表中添加一个新的组合,例如'INSERTED和B'。

针对上述问题的最佳方法是什么?

注意:在实际业务场景中,有更多的状态和检查(例如isFailed()canBeModified()等)具有许多不同的组合

即使不使用ENUMS,也可以建议任何方法。我提到了ENUMS,因为我不想偏离现有的实现

2 个答案:

答案 0 :(得分:3)

有很多种可能性,但你可以这样做(我删除了String状态,它没有添加任何值,因为它等于枚举的名称):

public enum RecordStatusEnum {
    CREATED(Condition.A, Condition.B),
    INSERTED(Condition.C),   
    FAILED();

    private Set<Condition> successConditions;

    RecordStatusEnum(Condition... successConditions) {
        this.successConditions = EnumSet.copyOf(Arrays.asList(successConditions));
    }

    public boolean isSuccess(Condition c) {
        return successConditions.contains(c);
    }
}

编辑:

有两组条件的示例:

public enum RecordStatusEnum {
    CREATED(EnumSet.of(Condition.A, Condition.B),
            EnumSet.of(Condition.C)),
    INSERTED(EnumSet.of(Condition.C),
             EnumSet.of(Condition.B),
    FAILED(EnumSet.noneOf(Condition.class),
           EnumSet.noneOf(Condition.class));

    private Set<Condition> successConditions;
    private Set<Condition> modificationConditions;

    RecordStatusEnum(Set<Condition> successConditions,
                     Set<Condition> modificationConditions) {
        this.successConditions = successConditions;
        this.modificationConditions = modificationConditions;
    }

    public boolean isSuccess(Condition c) {
        return successConditions.contains(c);
    }

    public boolean canBeModified(Condition c) {
        return modificationConditions.contains(c);
    }
}

答案 1 :(得分:0)

您还可以比较序数值,如下所示:

public enum RecordStatusEnum {
   CREATED,
   INSERTED,   
   UPDATED,
   NEW,
   FAILED,
   FAILED_NO_DB,
   FAILED_CONSTRAINT_VIOLATION;


 public boolean isPersisted(RecordStatusEnum status) {
    return status.ordinal < NEW.ordinal;
 }

 public boolean isError(RecordStatusEnum status){
    return status.ordinal >= FAILED.ordinal;
 }

}