Abstract val

Implementing an abstract val property is not significantly different than implementing a regular val property, other than needing the override keyword as you would with implementing an abstract function:

abstract class Base {
  abstract val something: String
}

class SomethingSource : Base() {
  override val something: String = "like, whatever"
}

fun main() {
  println(SomethingSource().something)
}

Here, Base defines an abstract property, and SomethingSource extends Base. As a result, SomethingSource needs to provide a concrete implementation of the abstract property. In this case, since it is a val, we just use a string literal.

This is equivalent to implementing a custom getter:

abstract class Base {
  abstract val something: String
}

class SomethingSource : Base() {
  override val something: String
    get() = "like, whatever"
}

fun main() {
  println(SomethingSource().something)
}

However, the get() syntax provides more flexibility. For example, suppose that we wanted to use a random number instead of a string literal. If we assign a random number to something, that is the one-and-only something value:

import kotlin.random.Random

abstract class Base {
  abstract val something: Int
}

class SomethingSource : Base() {
  override val something = Random.nextInt(1,100)
}

fun main() {
  val source = SomethingSource()
  
  println(source.something)
  println(source.something)
  println(source.something)
}

If, on the other hand, we implement get(), since get() is called on every access of the property, we get a fresh random number every time that we refer to something:

import kotlin.random.Random

abstract class Base {
  abstract val something: Int
}

class SomethingSource : Base() {
  override val something
    get() = Random.nextInt(1,100)
}

fun main() {
  val source = SomethingSource()

  println(source.something)
  println(source.something)
  println(source.something)
}

Prev Table of Contents Next

This book is licensed under the Creative Commons Attribution-ShareAlike 4.0 International license.