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?
Primero puede obtener la MyEnum
instancia de String str
y luego usar switch
por 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 Optional
la medida de lo posible. También Optional.get()
viola el getter
contrato:
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 MyEnum
la 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);
}
}