In dit artikel leer je met behulp van voorbeelden over objectverklaringen (singletons) en objectuitdrukkingen.
Objectverklaringen
Singleton is een objectgeoriënteerd patroon waarbij een klasse slechts één instantie (object) kan hebben.
U werkt bijvoorbeeld met een toepassing met een SQL-database-backend. U wilt een verbindingspool maken om toegang te krijgen tot de database terwijl u dezelfde verbinding hergebruikt voor alle clients. Hiervoor kunt u de verbinding maken via de singleton-klasse, zodat elke client dezelfde verbinding krijgt.
Kotlin biedt een gemakkelijke manier om singletons te maken met behulp van de objectdeclaratiefunctie. Daarvoor wordt het object-trefwoord gebruikt.
object SingletonExample (… // body van klasse…)
De bovenstaande code combineert een klassendeclaratie en een declaratie van een enkele instantie SingletonExample van de klasse.
Een objectverklaring kan eigenschappen, methoden enzovoort bevatten. Ze mogen echter geen constructeurs hebben (wat logisch is). Waarom?
Net als bij objecten van een normale klasse, kunt u methoden aanroepen en toegang krijgen tot eigenschappen met behulp van de .
notatie.
Voorbeeld: objectverklaring
object Test ( private var a: Int = 0 var b: Int = 1 fun makeMe12(): Int ( a = 12 return a ) ) fun main(args: Array) ( val result: Int result = Test.makeMe12() println("b = $(Test.b)") println("result = $result") )
Wanneer u het programma uitvoert, is de uitvoer:
b = 1 resultaat = 12
Objectdeclaratie kan op dezelfde manier als normale klassen erven van klassen en interfaces.
Singletons en afhankelijkheidsinjectie
Objectverklaringen kunnen soms nuttig zijn. Ze zijn echter niet ideaal in grote softwaresystemen die communiceren met veel andere delen van het systeem.
Aanbevolen literatuur: Dependency Injection & Singleton Design-patroon
Kotlin-objectuitdrukkingen
Het sleutelwoord object kan ook worden gebruikt om objecten van een anonieme klasse te maken die bekend staat als anonieme objecten. Ze worden gebruikt als u een object van een kleine wijziging van een klasse of interface moet maken zonder daarvoor een subklasse te declareren. Bijvoorbeeld ,
window.addMouseListener (object: MouseAdapter () (override fun mouseClicked (e: MouseEvent) (//…) override fun mouseEntered (e: MouseEvent) (//…)))
(Het voorbeeld is afkomstig van de officiële Kotlin docs-pagina.)
Hier wordt een anoniem object verklaard dat de klasse MouseAdapter uitbreidt. Het programma overschrijft twee MouseAdapter
methoden: mouseClicked()
en mouseEntered()
.
Indien nodig kunt u het anonieme object een naam geven en het in een variabele opslaan. Bijvoorbeeld,
val obj = object: MouseAdapter () (override fun mouseClicked (e: MouseEvent) (//…) override fun mouseEntered (e: MouseEvent) (//…))
Voorbeeld: Kotlin Object Expression
open class Person() ( fun eat() = println("Eating food.") fun talk() = println("Talking with people.") open fun pray() = println("Praying god.") ) fun main(args: Array) ( val atheist = object : Person() ( override fun pray() = println("I don't pray. I am an atheist.") ) atheist.eat() atheist.talk() atheist.pray() )
Wanneer u het programma uitvoert, is de uitvoer:
Voedsel eten. Praten met mensen. Ik bid niet. Ik ben een atheïst.
Hier wordt het anonieme object opgeslagen in de variabele atheïst die de klasse Persoon implementeert waarbij de pray()
methode wordt overschreven.
Als u een klasse implementeert die een constructor heeft om een anoniem object te declareren, moet u de juiste constructorparameters doorgeven. Bijvoorbeeld,
open class Person(name: String, age: Int) ( init ( println("name: $name, age: $age") ) fun eat() = println("Eating food.") fun talk() = println("Talking with people.") open fun pray() = println("Praying god.") ) fun main(args: Array) ( val atheist = object : Person("Jack", 29) ( override fun pray() = println("I don't pray. I am an atheist.") ) atheist.eat() atheist.talk() atheist.pray() )
Wanneer u het programma uitvoert, is de uitvoer:
naam: Jack, leeftijd: 29 Eten. Praten met mensen. Ik bid niet. Ik ben een atheïst.