如何从 属性 获取枚举值
How to get enum value from property
我有一个枚举值 VALID
和 INVALID
,它们有一个关联的布尔值 属性。我想根据我提供的布尔值获取枚举值。
如果是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 解决方案使这项工作有效,但我认为这不是可靠的解决方案。
你应该始终编写独立的代码。
- 因为他的解决方案是硬编码的。如果更改
VALID
和 INVALID
的值会怎样。你也会改变你的 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
}
我有一个枚举值 VALID
和 INVALID
,它们有一个关联的布尔值 属性。我想根据我提供的布尔值获取枚举值。
如果是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 解决方案使这项工作有效,但我认为这不是可靠的解决方案。
你应该始终编写独立的代码。
- 因为他的解决方案是硬编码的。如果更改
VALID
和INVALID
的值会怎样。你也会改变你的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
}