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

我通过定义如下的ENUM来validation从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,因为我不想偏离现有的实现

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

 public enum RecordStatusEnum { CREATED(Condition.A, Condition.B), INSERTED(Condition.C), FAILED(); private Set 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 successConditions; private Set modificationConditions; RecordStatusEnum(Set successConditions, Set 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); } } 

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

 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; } 

}