À Scala, quelle est la différence entre
val a = 1
et
final val fa = 1
final
les membres ne peuvent pas être remplacés, par exemple, dans une sous-classe ou un trait.
Légal:
class A {
val a = 1
}
class B extends A {
override val a = 2
}
Illégal:
class A {
final val a = 1
}
class B extends A {
override val a = 2
}
Vous obtiendrez une erreur comme celle-ci:
: 9: erreur: remplacement de la valeur a dans la classe A de type Int (1);
valeur un ne peut pas remplacer le dernier membre
Dans Scala, final
déclare qu'un membre ne peut pas être remplacé dans les sous-classes. Par exemple:
class Parent {
val a = 1
final val b = 2
}
class Subclass extends Parent {
override val a = 3 // this line will compile
override val b = 4 // this line will not compile
}
En outre, comme indiqué dans Pourquoi les valeurs "private val" et "private final val" sont-elles différentes? , si un final val
le champ contient une "valeur constante", un type primitif constant, l'accès à celui-ci sera remplacé par le bytecode pour charger cette valeur directement.
Vous ne pouvez pas non plus utiliser des non -final
val
s dans des annotations (Java).
Par exemple, ceci:
@GameRegistry.ObjectHolder(Reference.MOD_ID)
object ModItems{
}
compilera uniquement si MOD_ID
est déclaré comme final
.