En términos de Java, los símbolos son cadenas internas. Esto significa, por ejemplo, que la comparación de igualdad de referencia (eq
en Scala y ==
en Java) da el mismo resultado que la comparación de igualdad normal (==
en Scala y equals
en Java): 'abcd eq 'abcd
devolverá verdadero, mientras que "abcd" eq "abcd"
podría no, dependiendo de JVM caprichos (bueno, debería ser para literales, pero no para cadenas creadas dinámicamente en general).
Otros idiomas que utilizan símbolos son Lisp (que utiliza 'abcd
como Scala), Ruby (:abcd
), Erlang y Prolog (abcd
; que se denominan átomos en lugar de símbolos).
Usaría un símbolo cuando no me importa la estructura de una cadena y la utilizo simplemente como un nombre para algo. Por ejemplo, si tengo una tabla de base de datos que representa CD, que incluye una columna llamada "precio", no me importa que el segundo carácter en "precio" sea "r", o sobre concatenar nombres de columna; por lo que una biblioteca de base de datos en Scala podría razonablemente usar símbolos para nombres de tablas y columnas.
Probablemente valga la pena recordar que == en Scala hace.es igual a una cosa, así que realmente la diferencia sería cuando se usa el método "eq" que hace referencia a la igualdad. Una ventaja, sin embargo, es que la comparación entre símbolos es extremadamente barata. – Calum
@Calum, como lo es la comparación entre dos cadenas. Java interna (más o menos) todas las cadenas. –
@Elazar: ¿Es eso realmente cierto? Tenía la impresión de que Java solo internaba literales (es decir, casi todas las cadenas en ejemplos triviales, y casi ninguna cadena en software de producción). Habiendo dicho que los casos de uso de símbolos suelen ser valores literales (dudo que a menudo los construyas desde cero), posiblemente la principal ventaja que obtienes es simplemente un tipo más descriptivo. – Calum