Cómo utilizar la conmutación y parámetros de enumeración (No ENUM valor) en Java?

fatherazrael:

Tengo caja de conmutación con 50 controles de cadena en caso como se indica a continuación:

switch(str){
  case "Employee number":
    //setter
    break;
}

Quiero ponerlos en Enum con la descripción que figura a continuación:

enum myenum{
        EMPLOYEE_NUMBER("Employee number"),
        FIRST_NAME("First name");   

        private String desc;
        private myenum(String desc) {
            this.setDesc(desc);
        }
        public String getDesc() {
            return desc;
        }
        public void setDesc(String desc) {
            this.desc = desc;
        }

    }

Ahora, de la fuente i estoy recibiendo cadena "Número de empleado" y yo quiero escribir caso interruptor de tal manera que podamos comparar descripción de enumeración con la entrada de cadena de entrada en la caja.

He intentado algunos métodos de enumeración

myenum.valueOf(a); // This return enum value but not parameter
myenum.values // This is array which is also not useful here

Se le sugiere la forma en que se puede lograr en Enum? Estoy usando Java 8

y también sugieren elección correcta es enumeración aquí? o tendría que crear la clase cadena estática con los 50 valores o cualquier otra wayout mejor?

Vusal:

Primero puede obtener la MyEnuminstancia de String stry luego usar switchpor MyEnum, como a continuación:

enum MyEnum {
    EMPLOYEE_NUMBER("Employee number"),
    FIRST_NAME("First name");

    private String desc;

    MyEnum(String desc) {
        this.desc = desc;
    }

    public String getDesc() {
        return desc;
    }

    public static Optional<MyEnum> fromDesc(String desc) {
        return Stream.of(MyEnum.values()).filter(myEnum -> myEnum.getDesc().equals(desc)).findFirst();
    }

}

Y luego en el código principal:

Optional<MyEnum> maybeMyEnum = MyEnum.fromDesc(str);
if (maybeMyEnum.isPresent()) {
    switch(maybeMyEnum.get()){
        case EMPLOYEE_NUMBER:
            //setter
            break;
    }
}


UPD 1:
Como @Ole VV - dijo en un comentario, utilizando Optional.get()y Optional.isPresent()no es una buena práctica - la idea es - usted tiene que aplazar al obtener el valor de Optionalla medida de lo posible. También Optional.get()viola el gettercontrato:

Optional.get () es una "molestia atractiva" y es demasiado tentador para los programadores, lo que lleva a frecuentes errores. La gente no espera un captador para lanzar una excepción.

De JDK-8140281: (opt) añadir sin argumentos orElseThrow () como alternativa preferida para obtener ()

Así que teniendo en cuenta que, puede volver a escribir el código como:

...
MyEnum.fromDesc(str)
    .ifPresent(SomeClass::methodWithSwitchStatement);
...
class SomeClass {
    public static void methodWithSwitchStatement(MyEnum myEnum) {
        switch(myEnum){
            case EMPLOYEE_NUMBER:
               //setter
               break;
        }
    }
}
...

Los nombres en el código anterior son sólo ejemplos - no debe utilizar este tipo de nombres en su proyecto.


UPD 2:
Esta es la versión de MyEnumla caché de:

enum MyEnum {
    EMPLOYEE_NUMBER("Employee number"),
    FIRST_NAME("First name");

    private static final Map<String, MyEnum> cacheByDesc;
    static {
        cacheByDesc = Stream.of(MyEnum.values()).collect(Collectors.toMap(MyEnum::getDesc, e -> e));
    }

    private String desc;

    MyEnum(String desc) {
        this.desc = desc;
    }

    public String getDesc() {
        return desc;
    }

    public static Optional<MyEnum> fromDesc(String desc) {
        return Optional.ofNullable(desc)
                .map(cacheByDesc::get);
    }

}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=279431&siteId=1
Recomendado
Clasificación