Kotlin Soms heb je een alleen-lezen property in een class waarvan de waarde gecalculeerd wordt. Als het calculeren dan complex is en traag, dan wil je dit wellicht alleen doen wanneer de property daadwerkelijk wordt uitgelezen en ook slecht één keer.

In dat geval biedt Kotlin een interessant constructie: lazy properties.

Voor de implementatie van het bordspel Hoogspanning is het nodig om te bepalen hoeveel steden een speler van stroom kan voorzien.

Dit is een combinatorisch NP-hard probleem en de calculatie daarvan kan ik met een lazy property oplossen:

data class PlayerState(val powerPlants: List<PowerPlant>,
                       val resources: Map<ResourceType, Int>) {

    // ...

    /**
     * Number of cities that, given the power plants and resources, this player can supply power to.
     */
    val numberOfCitiesCanSupply: Int by lazy {
        powerPlants
                .combinations()
                .filter { combination -> combination.enoughResources(resources) }
                .map { combination -> combination.map(PowerPlant::powers).sum() }
                .max() ?: 0
    }

}

Lees meer over delegated properties en de standaard lazy delegate: https://kotlinlang.org/docs/reference/delegated-properties.html#lazy.