Подтвердить что ты не робот

В Scala разница между окончательным значением val и val

В Scala, в чем разница между

val a = 1

и

final val fa = 1
4b9b3361

Ответ 1

Члены

final не могут быть переопределены, скажем, в подклассе или признаке.

Допустимо:

class A {
    val a = 1
}

class B extends A {
    override val a = 2
}

Illegal:

class A {
    final val a = 1
}

class B extends A {
    override val a = 2
}

Вы получите сообщение об ошибке:

: 9: ошибка: переопределяющее значение a в классе A типа Int (1);

Значение a не может переопределить конечный элемент

Ответ 2

В Scala, final объявляет, что элемент не может быть переопределен в подклассах. Например:

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
}

Также, как обсуждалось в Почему` private val` и `private final val` отличаются?, если поле final val содержит "постоянное значение", постоянный примитивный тип, доступ к нему будет заменен байт-кодом для непосредственного загрузки этого значения.

Ответ 3

Вы также не можете использовать аннотации < final val в (Java).

Например, это:

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

будет компилироваться, только если MOD_ID объявлен как final.