¿Cómo cargar el valor de un ENUM desde un archivo XML?

Soy nuevo en Java e intento analizar un archivo XML con objetos que también tienen parámetros ENUM. Uno de los ENUM también tiene un valor. Y al analizar, recibo un mensaje de error (java.lang.IllegalArgumentException: No hay enumeración constante com.codecool.enums.AreaToUse.4).

el ENUM es

public enum AreaToUse {
    TRAFICH(6),
    TRAFICM(5),
    HOMEH(4),
    HOMEL(3);

    private final int qualified;

    AreaToUse(int qualified) {
        this.qualified = qualified;
    }

    public int getQualified() {
        return qualified;
    }
}

el xml

<Lumber name="pineLong" producer="Nati" load="M" value="17.3"
 qualified="4" length="3200" width="350" thickness="22"
 species="pine"/>

y el análisis

for (int i = 0; i < lumbers.getLength(); i++) {
    current = (Element) lumbers.item(i);
    result.add(new Lumber(current.getAttribute("name"),
                      current.getAttribute("producer"),
                      Load.valueOf(current.getAttribute("load")),
                 Double.parseDouble(current.getAttribute("value")),
              AreaToUse.valueOf(current.getAttribute("qualified")),
                  Integer.parseInt(current.getAttribute("length")),
                Integer.parseInt(current.getAttribute("width")),
               Integer.parseInt(current.getAttribute("thickness")),
                current.getAttribute("species")));
}

mi resultado esperado es

pino Largo, Nati, M, 17.3, 4, 3200, 350, 22, pino

el retorno real es java.lang.IllegalArgumentException: no hay enumeración constante com.codecool.enums.AreaToUse.4

Respuesta 1

Usted debe tener un método de utilidad, como valueOfInten ENUM AreaToUse lo que convertirá tu qualified inta un corresponding ENUMvalor.

public static AreaToUse valueOfInt(int i) {
    return Arrays.stream(AreaToUse.values())
            .filter(e -> e.getQualified() == i)
            .findFirst()
            .orElse(null);
}

Y úsalo como:

AreaToUse.valueOfInt(current.getAttribute("qualified"))

Si current.getAttribute("qualified")devuelve una cadena, analícela en entero.

AreaToUse.valueOfInt(Integer.parseInt(current.getAttribute("qualified")))
Respuesta: 2

Estoy intentando abstraer algunos detalles de implementación de mi nivel de persistencia. Tal como está, tengo dos funciones, una que crea un ARRAY y otra que crea un ArrayDescriptor. Soy ...

¿Cuál es el enfoque común (o patrón de diseño) para este "problema"? Tengo una gran cantidad de controladores en una aplicación web (las acciones de JAVA son precisas). Algunos controladores establecen variables en ...

Estoy tratando de escribir un programa que maneje el almacenamiento de estudiantes y asignaturas correspondientes, pero soy relativamente nuevo en las Listas de Java y tengo problemas para que la clase almacene y emita el ...

¿Hay una manera fácil de verificar si dos clases implementan una interfaz común? Estoy usando IntelliJ y llamo a una biblioteca de Java (cliente REST de alto nivel de Elastic Java) desde algún código de Kotlin. SearchHit y ...