W tym artykule dowiesz się o deklaracjach obiektów (singletonach) i wyrażeniach obiektowych na przykładach.
Deklaracje obiektów
Singleton to wzorzec zorientowany obiektowo, w którym klasa może mieć tylko jedną instancję (obiekt).
Na przykład pracujesz z aplikacją z zapleczem bazy danych SQL. Chcesz utworzyć pulę połączeń, aby uzyskać dostęp do bazy danych, używając tego samego połączenia dla wszystkich klientów. W tym celu możesz utworzyć połączenie za pośrednictwem klasy pojedynczej, aby każdy klient uzyskał to samo połączenie.
Kotlin zapewnia łatwy sposób tworzenia singletonów przy użyciu funkcji deklaracji obiektów. W tym celu używane jest słowo kluczowe object.
obiekt SingletonExample (… // treść klasy…)
Powyższy kod łączy w sobie deklarację klasy oraz deklarację pojedynczej instancji klasy SingletonExample.
Deklaracja obiektu może zawierać właściwości, metody i tak dalej. Jednak nie mogą mieć konstruktorów (co ma sens). Czemu?
Podobnie jak w przypadku obiektów zwykłej klasy, można wywoływać metody i uzyskiwać dostęp do właściwości przy użyciu .
notacji.
Przykład: deklaracja obiektu
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") )
Po uruchomieniu programu wynik będzie następujący:
b = 1 wynik = 12
Deklaracja obiektu może dziedziczyć z klas i interfejsów w podobny sposób jak zwykłe klasy.
Singletons i Dependency Injection
Deklaracje obiektów mogą być czasami przydatne. Jednak nie są one idealne w dużych systemach oprogramowania, które współdziałają z wieloma innymi częściami systemu.
Zalecana literatura: Wzorzec Dependency Injection i Singleton Design
Wyrażenia obiektów Kotlin
Słowo kluczowe object może również służyć do tworzenia obiektów klasy anonimowej zwanej obiektami anonimowymi. Są używane, jeśli potrzebujesz stworzyć obiekt o niewielkiej modyfikacji jakiejś klasy lub interfejsu bez deklarowania dla niego podklasy. Na przykład ,
window.addMouseListener (object: MouseAdapter () (przesłonięcie fun mouseClicked (e: MouseEvent) (//…) przesłanianie zabawy mouseEntered (e: MouseEvent) (//…)))
(Przykład pochodzi z oficjalnej strony dokumentacji Kotlin.)
W tym miejscu zadeklarowano anonimowy obiekt rozszerzający klasę MouseAdapter. Program przesłania dwie MouseAdapter
metody: mouseClicked()
i mouseEntered()
.
W razie potrzeby możesz przypisać nazwę do anonimowego obiektu i zapisać ją w zmiennej. Na przykład,
val obj = object: MouseAdapter () (override fun mouseClicked (e: MouseEvent) (//…) override fun mouseEntered (e: MouseEvent) (//…))
Przykład: wyrażenie obiektu Kotlin
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() )
Po uruchomieniu programu wynik będzie następujący:
Jedzenie. Rozmowa z ludźmi. Nie modlę się. Jestem ateistą.
Tutaj anonimowy obiekt jest przechowywany w zmiennej atheist, która implementuje klasę Person z pray()
metodą jest nadpisywana.
Jeśli implementujesz klasę, która ma konstruktora do deklarowania anonimowego obiektu, musisz przekazać odpowiednie parametry konstruktora. Na przykład,
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() )
Po uruchomieniu programu wynik będzie następujący:
imię: Jack, wiek: 29 lat Jedzenie. Rozmowa z ludźmi. Nie modlę się. Jestem ateistą.