如何从 属性 获取枚举值

How to get enum value from property

我有一个枚举值 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;
    }
}

您可以在枚举本身中使用静态查找方法来实现:

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

我会向您的枚举添加一个 parse 方法,它采用 boolean,遍历所有值和 returns 匹配的值,例如:

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

    throw new IllegalArgumentException();
}

@ernest_k 解决方案使这项工作有效,但我认为这不是可靠的解决方案。

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

  • 因为他的解决方案是硬编码的。如果更改 VALIDINVALID 的值会怎样。你也会改变你的 forBoolean 逻辑吗?
  • 因为他没有检查里面的枚举字段是什么。

可靠的解决方案将是@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();
    }
}

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

为什么只为存储 2 个布尔值而创建 Enum?

只需创建由 VALID & INVALID 命名的静态布尔值。

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

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