1

以下のように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

これは、「INSERTEDandB」などの新しい組み合わせをリストに簡単に追加できるようにする必要があります。

上記の問題に対する最善のアプローチは何ですか?

:実際のビジネスシナリオでは、さまざまな組み合わせのステータスとチェック(isFailed()canBeModified()など)がはるかに多くなります。

また、ENUMSを使用しない場合でも、任意の方法を提案できます。既存の実装から大きく逸脱したくないので、ENUMSについて言及しました

4

2 に答える 2

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

編集:

2 つの条件セットの例:

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 に答える