Ключевое слово val

Ключевое слово val используется для объявления неизменяемых свойств в классах Kotlin. Свойство, объявленное с val, может быть инициализировано только один раз и не может быть изменено после инициализации.

Синтаксис

kotlinval propertyName: Type = value
kotlinval propertyName = value // тип выводится автоматически
kotlinval propertyName: Type
  get() = expression

Пример

Объявление простого свойства только для чтения:

kotlinclass Person {
  val name: String = "John"
  val age = 25
}

val person = Person()
println(person.name)
println(person.age)

Результат выполнения кода:

kotlinString "John"
Int 25

Пример

Попытка изменить свойство val приведет к ошибке компиляции:

kotlinclass Person {
  val name: String = "John"
}

val person = Person()
person.name = "Mike" // Ошибка компиляции

Пример

Свойство val с пользовательским геттером:

kotlinclass Rectangle(val width: Int, val height: Int) {
  val area: Int
    get() = width * height
}

val rect = Rectangle(5, 10)
println(rect.area)

Результат выполнения кода:

kotlinInt 50

Пример

Инициализация val в блоке init:

kotlinclass User(val firstName: String, val lastName: String) {
  val fullName: String
  
  init {
    fullName = "$firstName $lastName"
  }
}

val user = User("John", "Doe")
println(user.fullName)

Результат выполнения кода:

kotlinString "John Doe"

Пример

Свойство val может быть лениво инициализировано с помощью by lazy:

kotlinclass ExpensiveResource {
  val heavyData: String by lazy {
    println("Computing heavy data...")
    "Computed Data"
  }
}

val resource = ExpensiveResource()
println(resource.heavyData)
println(resource.heavyData)

Результат выполнения кода:

kotlinString "Computing heavy data..."
String "Computed Data"
String "Computed Data"

Смотрите также

  • ключевое слово var,
    которое объявляет изменяемые свойства
  • ключевое слово lateinit,
    которое позволяет отложенную инициализацию переменных
  • ключевое слово lazy,
    которое обеспечивает ленивую инициализацию
  • ключевое слово get,
    которое определяет геттер для свойства