¿Cuál es el motivo de que val
s no (?) Sea automáticamente final en objetos singleton? P.ej.¿Por qué un `val` dentro de un` objeto` no es automáticamente final?
object NonFinal {
val a = 0
val b = 1
def test(i: Int) = (i: @annotation.switch) match {
case `a` => true
case `b` => false
}
}
resultados en:
<console>:12: error: could not emit switch for @switch annotated match
def test(i: Int) = (i: @annotation.switch) match {
^
Mientras
object Final {
final val a = 0
final val b = 1
def test(i: Int) = (i: @annotation.switch) match {
case `a` => true
case `b` => false
}
}
compila sin advertencias, por lo que presumiblemente genera la tabla de comparación de patrones más rápido.
Tener que agregar final
me parece un ruido molesto. ¿No es una final object
per se, y por lo tanto también sus miembros?
Hm. ¿Qué hay de los rasgos que podrían usarse? –
@TonyK. - ¿Qué quieres decir? Incluso si tuviera 'rasgo T {def a: Int}', el objeto anularía 'a' en las reglas de linealización. Si tuviera 'rasgo T {def a: Int = 33}', ok en ese caso 'anular valor final' no es posible. Pero creo que eso aún no descalifica el enfoque de hacer que _non-overriding_ vals final sea el predeterminado. –
de acuerdo. Soy relativamente nuevo en Scala ... estaba intentando explorar posibles avenidas en las que no habías pensado. –