Estamos implementando un adaptador para Jaxen (una biblioteca XPath para Java) que nos permite usar XPath para acceder al modelo de datos de nuestra aplicación.
Esto se realiza mediante la implementación de clases que asignan cadenas (que nos pasó de Jaxen) a elementos de nuestro modelo de datos. Estimamos que necesitaremos alrededor de 100 clases con más de 1000 comparaciones de cadenas en total.
Creo que la mejor manera de hacer esto es simple si / otras declaraciones con las cadenas escritas directamente en el código, en lugar de definir cada cadena como una constante. Por ejemplo:
public Object getNode(String name) {
if ("name".equals(name)) {
return contact.getFullName();
} else if ("title".equals(name)) {
return contact.getTitle();
} else if ("first_name".equals(name)) {
return contact.getFirstName();
} else if ("last_name".equals(name)) {
return contact.getLastName();
...
Sin embargo, siempre me enseñaron que no debemos incrustar valores de cadena directamente en el código, sino crear constantes de cadena en su lugar. Eso se vería así:
private static final String NAME = "name";
private static final String TITLE = "title";
private static final String FIRST_NAME = "first_name";
private static final String LAST_NAME = "last_name";
public Object getNode(String name) {
if (NAME.equals(name)) {
return contact.getFullName();
} else if (TITLE.equals(name)) {
return contact.getTitle();
} else if (FIRST_NAME.equals(name)) {
return contact.getFirstName();
} else if (LAST_NAME.equals(name)) {
return contact.getLastName();
...
En este caso, creo que es una mala idea. La constante solo se usará una vez, en el getNode()
método. Usar las cadenas directamente es tan fácil de leer y entender como usar constantes, y nos ahorra escribir al menos mil líneas de código.
Entonces, ¿hay alguna razón para definir constantes de cadena para un solo uso? ¿O es aceptable usar cadenas directamente?
PD. Antes de que alguien sugiera usar enumeraciones, creamos un prototipo de eso, pero la conversión de enumeración es 15 veces más lenta que la simple comparación de cadenas, por lo que no se está considerando.
Conclusión: las respuestas a continuación ampliaron el alcance de esta pregunta más allá de las constantes de cadena, por lo que tengo dos conclusiones:
- Probablemente esté bien usar las cadenas directamente en lugar de las constantes de cadena en este escenario, pero
- Hay formas de evitar el uso de cadenas, lo que podría ser mejor.
Así que voy a probar la técnica de envoltura que evita las cadenas por completo. Desafortunadamente, no podemos usar la instrucción de cambio de cadena porque todavía no estamos en Java 7. Sin embargo, en última instancia, creo que la mejor respuesta para nosotros es probar cada técnica y evaluar su rendimiento. La realidad es que si una técnica es claramente más rápida, entonces probablemente la elegiremos independientemente de su belleza o adhesión a la convención.
switch
etiquetas. Use un interruptor en lugar de if
cascadas.