В Scala разница между окончательным значением val и val
В Scala, в чем разница между
val a = 1
и
final val fa = 1
Ответы
Ответ 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
.