Al enviar enumeraciones entre mi código Java y una base de datos o aplicación cliente, a menudo termino leyendo y escribiendo los valores de enumeración como cadenas. toString()
se llama implícitamente al concatenar cadenas. Anular toString () en algunas enumeraciones significaba que a veces solo podía
"<input type='checkbox' value='" + MY_CONST1 + "'>"
y a veces tenía que recordar llamar
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
lo que condujo a errores, así que ya no hago eso. En realidad, no anulo ningún método en Enum porque si los aplica a un código de cliente suficiente, eventualmente romperá las expectativas de alguien.
Haga su propio nombre de método nuevo, como public String text()
o toEnglish()
o lo que sea.
Aquí hay una pequeña función auxiliar que podría ahorrarle algo de escritura si tiene muchas enumeraciones como la anterior:
public static String ucFirstLowerRest(String s) {
if ( (s == null) || (s.length() < 1) ) {
return s;
} else if (s.length() == 1) {
return s.toUpperCase();
} else {
return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
}
}
Siempre es fácil llamar a .toUpperCase () o .toLowerCase (), pero recuperar mayúsculas y minúsculas puede ser complicado. Considere el color, "bleu de France". Francia siempre está en mayúscula, por lo que es posible que desee agregar un método textLower () a su enumeración si se encuentra con eso. Cuando usa este texto al comienzo de una oración, frente a la mitad de una oración, frente a un título, puede ver cómo un solo toString()
método se quedará corto. Y eso ni siquiera toca caracteres que son ilegales en los identificadores de Java, o que son difíciles de escribir porque no están representados en teclados estándar, o caracteres que no tienen mayúsculas (Kanji, etc.).
enum Color {
BLEU_DE_FRANCE {
@Override public String textTc() { return "Bleu De France"; }
@Override public String textLc() { return "bleu de France"; }
}
CAFE_NOIR {
@Override public String textTc() { return "Café Noir"; }
}
RED,
YELLOW,
GREEN;
// The text in title case
private final String textTc;
private Color() {
textTc = ucFirstLowerRest(this.toString());
}
// Title case
public String textTc() { return textTc; }
// For the middle of a sentence
public String textLc() { return textTc().toLowerCase(); }
// For the start of a sentence
public String textUcFirst() {
String lc = textLc();
return lc.substring(0, 1).toUpperCase() + lc.substring(1);
}
}
No es tan difícil usarlos correctamente:
IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
color2.textLc() + "!")
Esperemos que eso también demuestre por qué el uso de valores de enumeración de mayúsculas y minúsculas también lo decepcionará. Una última razón para mantener todo en mayúsculas con constantes enum de subrayado es que hacerlo sigue el Principio de Menos Asombro. La gente lo espera, así que si haces algo diferente, siempre tendrás que explicarte a ti mismo o tratar con personas que usen mal tu código.