我通过定义如下的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,因为我不想偏离现有的实现
答案 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;
}
}