1

我正在通过定义如下 ENUM 来验证从数据库中检索到的记录的状态

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;对他们来说,员工表“条件”中有一个列。

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

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

CREATED and A 
CREATED and B
INSERTED and C

必须实现这一点,以便我可以轻松地将新组合“插入和 B”添加到列表中。

解决上述问题的最佳方法是什么?

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

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

4

2 回答 2

3

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

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);
    }
}
于 2012-12-09T15:23:17.660 回答
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;
 }

}

于 2012-12-09T15:32:23.703 回答