In Java ausgedrückt sind Symbole internierte Strings. Dies bedeutet beispielsweise, dass der Vergleich der Bezugsgleichheit (eq
in Scala und ==
in Java) das gleiche Ergebnis liefert wie der normale Gleichheitsvergleich (==
in Scala und equals
in Java): 'abcd eq 'abcd
wird wahr zurückgeben, während "abcd" eq "abcd"
möglicherweise nicht, abhängig von JVMs Launen (gut, es sollte für Literale, aber nicht für Strings im Allgemeinen dynamisch erstellt werden).
Andere Sprachen, die Symbole verwenden, sind Lisp, Rubin (:abcd
), Erlang und Prolog (die 'abcd
wie Scala verwendet) (abcd
, sie sind Atome anstelle von Symbolen genannt).
Ich würde ein Symbol verwenden, wenn mir die Struktur eines Strings egal ist, und benutze es nur als Namen für etwas. Zum Beispiel, wenn ich eine Datenbanktabelle habe, die CDs repräsentiert, die eine Spalte mit dem Namen "price" enthält, ist es mir egal, dass das zweite Zeichen in "price" "r" ist, oder über die Verkettung von Spaltennamen; Daher könnte eine Datenbankbibliothek in Scala sinnvolle Symbole für Tabellen- und Spaltennamen verwenden.
Es ist wahrscheinlich wert, daran zu erinnern, dass == in Scala das tut.Gleiches Ding, so wirklich würde der Unterschied sein, wenn man die "eq" Methode benutzt, die Gleichheit referenziert. Ein Bonus ist jedoch, dass der Vergleich zwischen Symbolen extrem billig ist. – Calum
@Calum, wie ist der Vergleich zwischen zwei Strings. Java Praktikanten (mehr oder weniger) alle Strings. –
@Elazar: Stimmt das wirklich? Ich hatte den Eindruck, dass Java nur Literale internierte (d. H. Fast alle Strings in trivialen Beispielen und fast keine Strings in der Produktionssoftware). Wenn man sagt, dass die Use-Cases von Symbolen in der Regel wörtliche Werte sind (ich bezweifle, dass man sie oft von Grund auf neu erstellt), so ist der Hauptvorteil, den man bekommt, wohl eher ein beschreibender Typ. – Calum