Información y enlaces

Participa comentando, viendo lo que otros tienen que decir, o enlazandolo desde tu blog.


Otros artículos
El retorno del Rey
Los señores de la Guerra

Java5, uso correcto de enum, un caso real.

Posteado por dbejar en 19 May, 2007

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,



Escriba un comentario

Tomate un momento para comentar y contar lo que piensas sobre el post. Puedes usar un HTML básico para formatear

Comentarios leidos

Chapuza????? Grrr…