web-dev-qa-db-fra.com

A Scala, différence entre val final et val

À Scala, quelle est la différence entre

val a = 1

et

final val fa = 1
41
elm

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

56
Michael Zajac

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.

11
wingedsubmariner

Vous ne pouvez pas non plus utiliser des non -finalvals dans des annotations (Java).

Par exemple, ceci:

@GameRegistry.ObjectHolder(Reference.MOD_ID)
object ModItems{
}

compilera uniquement si MOD_ID est déclaré comme final.

2
Jin