如何从属性中获取枚举值

时间:2018-08-24 12:09:51

标签: java enumeration

我有一个值为VALIDINVALID的枚举,它们具有与之关联的布尔属性。我想根据我提供的布尔值获取枚举值。

如果是true,我应该得到VALID,如果是false,我应该得到INVALID。我想根据成员变量的值,使用以下类似的getter方法进行操作

public boolean getCardValidityStatus() {
    return CardValidationStatus status = CardValidationStatus(this.mCardValidityStatus));
}

我的代码:

private enum CardValidationStatus {
    VALID(true),
    INVALID(false);

    private boolean isValid;
    CardValidationStatus(boolean isValid) {
        this.isValid = isValid;
    }
    public boolean getValidityStatus() {
        return this.isValid;
    }
}

3 个答案:

答案 0 :(得分:6)

您可以使用枚举本身中的静态查找方法来实现这一目标:

private enum CardValidationStatus {
    VALID(true),
    INVALID(false);

    //...

    public static CardValidationStatus forBoolean(boolean status) {

        //this is simplistic given that it's a boolean-based lookup
        //but it can get complex, such as using a loop...
        return status ? VALID : INVALID; 
    }
}

可以使用以下方法检索相应的状态:

public CardValidationStatus getCardValidityStatus() {
    return CardValidationStatus.forBoolean(this.mCardValidityStatus));
}

答案 1 :(得分:1)

我会向您的枚举中添加一种parse方法,该方法采用boolean,对所有值进行迭代并返回与之匹配的值,例如:

public CardValidationStatus parse(boolean isValid) {
    for (CardValidationStatus cardValidationStatus : CardValidationStatus.values()) {
        if (cardValidationStatus.getValidityStatus() == isValid) {
            return cardValidationStatus;
        }
    }

    throw new IllegalArgumentException();
}

答案 2 :(得分:-1)

@ernest_k解决方案可以完成这项工作,但我认为这不是可靠的解决方案。

您应该始终编写独立的代码。

  • 因为他的解决方案是硬编码的。如果更改VALIDINVALID的值该怎么办。您还会更改forBoolean逻辑吗?
  • 因为他没有检查Enum字段包含的内容。

可靠的解决方案将是@DaveyDaveDave答案。当您具有VALID&INVAlID的许多状态时,这也将起作用。

private enum CardValidationStatus {
    VALID(true),
    INVALID(false);

    //...

    public CardValidationStatus forBoolean(boolean isValid) {
        for (CardValidationStatus cardValidationStatus : CardValidationStatus.values()) {
            if (cardValidationStatus.getValidityStatus() == isValid) {
                return cardValidationStatus;
            }
        }

        throw new IllegalArgumentException();
    }
}

建议(我认为最简单的方式)

为什么要使Enum仅用于存储2个布尔值?

只需使用VALIDINVALID命名静态布尔值即可。

public static final boolean CARD_STATUS_VALID = true;
public static final boolean CARD_STATUS_INVALID = false;

if(cardStatus == CARD_STATUS_VALID){
 // todo
}