Was ist der Grund für val
s nicht (?) In Singleton-Objekten automatisch endgültig? Z.B.Warum ist ein `val` in einem` Objekt` nicht automatisch final?
object NonFinal {
val a = 0
val b = 1
def test(i: Int) = (i: @annotation.switch) match {
case `a` => true
case `b` => false
}
}
ergibt:
<console>:12: error: could not emit switch for @switch annotated match
def test(i: Int) = (i: @annotation.switch) match {
^
Während
object Final {
final val a = 0
final val b = 1
def test(i: Int) = (i: @annotation.switch) match {
case `a` => true
case `b` => false
}
}
Kompiliert ohne Warnungen, so erzeugt vermutlich die schnelle Musterabgleich-Tabelle.
Hinzufügen final
scheint pure nerviger Lärm für mich. Ist kein object
per se endgültig und damit auch seine Mitglieder?
Hm. Was ist mit Eigenschaften, die verwendet werden könnten? –
@TonyK. - Was meinen Sie? Selbst wenn ich "Merkmal T {def a: Int}" hätte, würde das Objekt in den Linearisierungsregeln "a" außer Kraft setzen. Wenn ich "Merkmal T {def a: Int = 33}" hätte, wäre ok in diesem Fall 'override final val 'nicht möglich. Aber ich denke, das disqualifiziert immer noch nicht den Ansatz, standardmäßig _non-overriding_vals endgültig zu machen. –
Einverstanden. Ich bin relativ neu in Scala ... habe versucht, mögliche Wege zu erkunden, an die du nicht gedacht hast. –