Java 如何从属性获取枚举值

Java 如何从属性获取枚举值,java,enumeration,Java,Enumeration,我有一个枚举,其值分别为有效和无效,它们有一个与之关联的布尔属性。我想根据我提供的布尔值获取枚举值 如果它是真的我应该得到有效的,如果它是假的我应该得到无效的。我希望根据成员变量的值,在下面这样的getter方法中这样做 public boolean getCardValidityStatus() { return CardValidationStatus status = CardValidationStatus(this.mCardValidityStatus)); } 我的代码:

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

如果它是
真的
我应该得到
有效的
,如果它是
假的
我应该得到
无效的
。我希望根据成员变量的值,在下面这样的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
方法,该方法采用
布尔值
,迭代所有值并返回匹配的值,例如:

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

    throw new IllegalArgumentException();
}
@ernest_k解决方案实现了这一点,但我认为这不是可靠的解决方案。 您应该始终编写独立的代码

  • 因为他的解决方案是硬编码的。如果
    VALID
    INVALID
    的值发生更改,该怎么办。您是否也将
    更改为布尔逻辑
  • 因为他没有检查枚举字段中包含的内容
可靠的解决方案将是@DaveyDaveDave答案。当您有许多状态为“有效”和“无效”时,这也会起作用

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个布尔值

只需将名为
的静态布尔值设置为有效
&
无效

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

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

对于你的例子,ernest_k的答案可能更好,但我已经包括了一个相同的例子,如果你有布尔值以外的东西。