2012-12-09 50 views
1

我通过定义ENUM如下什么是使用Java中的ENUMS验证值组合的最佳方法?

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()验证从DB中检索到的记录的状态被用来检查所检索的记录的状态(从雇员列状态)

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

根据新的要求,有一组条件介绍说A,B和C;对于他们来说,员工表'条件'中有一列。

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

对于如:isSuccess()应该检查是否在以下几点:

CREATED and A 
CREATED and B 
INSERTED and C 

这必须实现,使得它容易让我添加一个新的组合,说“插入B”到列表中很容易。

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

注意:在实际业务场景还有很多更多的状态,并与许多不同的组合

而且任何方法检查(如isFailed()canBeModified()等),可以建议即使它不使用ENUMS。我提到ENUMS,因为我不想偏离现有的实现

回答

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); 
    } 
} 
+0

如果我需要有另一个检查说canBeModified(),它允许执行以下操作:“插入B”,“当前和C '?? – user1583803

+0

为每个枚举添加另一个'Set modificationConditions'。显然,您必须更改构造函数以将两个'Set '作为参数。看到我编辑的答案。 –

+0

谢谢。这里的“条件”究竟是什么?它是我们应该定义的属性“状态”和“条件”的类吗?我们不应该分别定义successConditions吗?为什么你将枚举定义为CREATED(A,B)和INSERTED(C)? – user1583803

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

}

相关问题