Как преобразовать строковый результат перечисления с переопределенным toString () назад к перечислению?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

21
задан Jason Gritman 17 January 2010 в 05:48
поделиться

5 ответов

Лучший и самый простой способ сделать это похож на это:

public enum AgeRange {
    A18TO23 ("18-23"),
    A24TO29 ("24-29"),
    A30TO35("30-35");

    private String value;

    AgeRange(String value){
        this.value = value;
    }

    public String toString(){
        return value;
    }

    public static AgeRange getByValue(String value){
        for (final AgeRange element : EnumSet.allOf(AgeRange.class)) {
            if (element.toString().equals(value)) {
                return element;
            }
        }
        return null;
    }
}

Тогда просто необходимо вызвать getByValue() метод с эти String вход в нем.

30
ответ дан 29 November 2019 в 20:21
поделиться

Вы могли всегда создавать карту из строки для оценки - делают так статически, таким образом, только необходимо отобразить ее однажды, предположив, что возвращаемая строка остается тем же со временем. Нет ничего встроенного, насколько я знаю.

7
ответ дан 29 November 2019 в 20:21
поделиться
for (AgeRange ar: EnumSet.allOf(AgeRange)) {
    if (ar.toString().equals(inString)) {
         myAnswer = ar;
         break;
    }
}

Или что-то как этот? Просто введенный, не пробежали компилятор. Простите (комментируют) опечатки...

Или логика использования как это для создания карты однажды. Избегайте повторения во времени выполнения. Хорошая идея, Jon.

2
ответ дан 29 November 2019 в 20:21
поделиться

Класс переопределяет "toString ()" - так, для получения обратной операции, необходимо переопределить valueOf() для перевода вывода toString() назад к Перечислимым значениям.

public enum AgeRange {

   A18TO23 {
        public String toString() {        
                return "18 - 23";
        }
        public AgeRange valueOf (Class enumClass, String name) {
                return A18T023
        }
    },

    .
    .
    .
}

Покупатель остерегаются - нескомпилированный и непротестированный...

механизм для toString() и valueOf() является зарегистрированной частью API

2
ответ дан 29 November 2019 в 20:21
поделиться

Вы могли попробовать что-то как следующее?

static AgeRange fromString(String range) {
    for (AgeRange ageRange : values()) {
        if (range.equals(ageRange.toString())) {
            return ageRange;
        }
    }
    return null;   
}

Или, как предложенные другие, с помощью кэширующегося подхода:

private static Map<String, AgeRange> map;

private static synchronized void registerAgeRange(AgeRange ageRange) {
    if (map == null) {
        map = new HashMap<String, AgeRange>();
    }
    map.put(ageRange.toString(), ageRange);
}

AgeRange() {
    registerAgeRange(this);
}

static AgeRange fromString(String range) {
    return map.get(range);
}
0
ответ дан 29 November 2019 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: