Java5, uso correcto de enum, un caso real.

Vale, por una vez me voy a dejar de foos y bars y voy a extraer un pedacito de un codigo que ando ultimamente refactorizando…

En la situacion de partida, tenia un codigo de Java1.4, pero nos hemos migrado a Java5, asi que siempre que puedo toqueteo por aqui y por alla para que el codigo tenga un look&feel java5 real. 🙂

El fragmento de codigo del que partiamos era el siguiente:


//Recuperamos el tipo de rendicion (MODELO: NORMAL, SIMPLIFICADO, BASICO)
String modelo = request.getParameter("modelo");
if(modelo==null ){
modelo = Constantes.MODELO_RENDICION_NORMAL;
}
if(!modelo.equalsIgnoreCase(Constantes.MODELO_RENDICION_NORMAL) &&!modelo.equalsIgnoreCase(Constantes.MODELO_RENDICION_SIMPLIFICADO)
&& !modelo.equalsIgnoreCase(Constantes.MODELO_RENDICION_BASICO)){
//Trampas
modelo = Constantes.MODELO_RENDICION_NORMAL;
}
log.debug("Tenemos MODELO DE RENDICION: "+modelo);

No creo que requiera mucha explicacion, pero basicamente ese codigo chequea que no nos hacian trampas, y nos llegaba un modelo vacio, o distinto de uno de esos tres: NORMAL, SIMPLIFICADO, BASICO.

Para los que venimos de la escuela del C/C++ encontramos ese codigo, nos resulta, poco menos que realmente horrible por el uso de las constantes (a la manera de #define).

Vale, aqui llego yo de pasada, y apesar de las prisas no puedo evitar meterle mano. Me «cargo» las constantes, y creo un enum…

Las constantes:


//Moved to TipoCuenta enum
public static final String MODELO_RENDICION_NORMAL = TipoCuenta.NORMAL.getModeloRendicion();
public static final String MODELO_RENDICION_SIMPLIFICADO = TipoCuenta.SIMPLIFICADO.getModeloRendicion();
public static final String MODELO_RENDICION_BASICO = TipoCuenta.BASICO.getModeloRendicion();

El enum:


/**
* To distinguish among the different types of accounts avoiding
* the *risky* use of constants
* @author dbejar
*
*/
public enum TipoCuenta {
NORMAL		("Normal","N04","xxxxxx","xxxxxx","xxxxxx"),
SIMPLIFICADO	("Simplificado","S04","xxxxxx","xxxxxx","xxxxxx"),
BASICO		("Basico","B04","xxxxxx","xxxxxx","xxxxxx"),

private String nombreCuenta;
private String modeloRendicion;
private String tipoCuenta;
private String nsCuenta;
private String validacionLiq;

TipoCuenta(String nombreCuenta, String modeloRendicion, String tipoCuenta, String nsCuenta, String validacionLiq){
this.nombreCuenta=nombreCuenta;
this.modeloRendicion=modeloRendicion;
this.tipoCuenta=tipoCuenta;
this.nsCuenta=nsCuenta;
this.validacionLiq=validacionLiq;
}
public String getnombreCuenta(){
return nombreCuenta;
}
public String getModeloRendicion(){
return modeloRendicion;
}
public String getTipoCuenta(){
return tipoCuenta;
}
public String getNSCuenta(){
return nsCuenta;
}
public String getValidacionLiq(){
return validacionLiq;
}
}

Tengo que decir que tengo la mania de codificar en ingles, y que las xxxxxx, son censura 🙂

Vale, ahora el codigo original seria equivalente a:


//Recuperamos el tipo de rendicion (MODELO: NORMAL, SIMPLIFICADO, BASICO)
String modelo = request.getParameter("modelo");
if(modelo==null){
modelo = TipoCuenta.NORMAL.getModeloRendicion();
}
if(!modelo.equalsIgnoreCase(TipoCuenta.NORMAL.getModeloRendicion()) &&!modelo.equalsIgnoreCase(TipoCuenta.SIMPLIFICADO.getModeloRendicion())
 && !modelo.equalsIgnoreCase(TipoCuenta.BASICO.getModeloRendicion())){
//Trampas
modelo = TipoCuenta.NORMAL.getModeloRendicion();
}
log.debug("Tenemos MODELO DE RENDICION: "+modelo);
rendicion.setModelo(modelo);

Con lo que no estamos haciendo ningun uso real de las ventajas de utilizar enums.

El codigo refactorizado quedo asi:


//Recuperamos el tipo de rendicion (MODELO: NORMAL, SIMPLIFICADO, BASICO)
//Modelo NORMAL por defecto
String modelo = request.getParameter("modelo");
if(modelo==null ){
modelo = TipoCuenta.NORMAL.getModeloRendicion();
}
//This is just to check that we got a valid TipoCuenta
try{
switch (TipoCuenta.valueOf(modelo)){
case BASICO: /*NOOP*/
default: /*NOOP means no operation*/
break;
}
}catch(IllegalArgumentException e){
//Trampas
modelo = TipoCuenta.NORMAL.getModeloRendicion();
}
log.debug("Tenemos MODELO DE RENDICION: "+modelo);

Bueno, en realidad, he añadido lo de case BASICO: para ilustrar mejor a todos los javeros sin experiencia en C la diferencia entre la chapuza de las constantes, y un codigo robusto con enum.

Hala pues,

Comentarios

Comments are closed.