Как получить значение enum из свойства - PullRequest
0 голосов
/ 24 августа 2018

У меня есть перечисление со значениями VALID и INVALID, с которыми связано логическое свойство.Я хотел бы получить значение enum на основе предоставленного мной логического значения.

Если это true, я должен получить VALID, если это false, я должен получить INVALID.Я хотел бы сделать это в методе получения, подобном приведенному ниже, на основе значения переменной-члена

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 голосов
/ 24 августа 2018

Я бы добавил parse метод к вашему перечислению, который принимает boolean, перебирает все значения и возвращает то, которое соответствует, например:

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

    throw new IllegalArgumentException();
}
0 голосов
/ 24 августа 2018

@ ernest_k решение сделало эту работу, но я думаю, что это не надежное решение.

Вы всегда должны делать код, который независим.

  • Потому что его решение жестко закодировано. Что делать, если значения VALID & INVALID изменены. Вы тоже поменяете свою 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 логических значений?

Просто сделайте статическое логическое имя с именем VALID & INVALID.

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

if(cardStatus == CARD_STATUS_VALID){
 // todo
}
0 голосов
/ 24 августа 2018

Вы можете достичь этого, используя метод статического поиска в самом перечислении:

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