Una classe defineix l'estructura d'un objecte i un conjunt de funcions associades a aquest tipus d'objecte.
Introducció
Crea un nou projecte amb Gradle amb el nom otter
.
Propietats
Un classe defineix un conjunt de valors i variables que s'agrupen dins una sola entitat mitjançant la definició d'una classe.
Per exemple, aquesta classe:
classDiagram direction LR class Person { val name: String var married: Boolean }
És pot escriure directament en Kotlin:
class Person(
val name: String,
var married: Boolean
)
Aquest conjunt de valors i variables s'anomenen propietats de la classe.
Al crear una instància de la classe (un objecte) tinc accés a totes aquestes propietats mitjançant l'operardor .
:
class Person(
val name: String,
var married: Boolean
)
fun main() {
val maria = Person("Maria", false)
require(maria.married == false)
}
Activitat
1.- Modifica el fitxer App.kt
amb el codi que està a dalt.
Verifica que s'executa sense que es produeixi cap error.
2.- Afegeix una nova classe Product
al fitxer App.kt
.
classDiagram direction LR class Product { val id: Long var name: String }
Verifica que pots accedir i modificar les propietats var
.
package org.example
class Product(
val id: Long,
var name: String
)
fun main() {
val iphone = Product(144, "iPhone")
require(iphone.name == "iPhone")
iphone.name = "iPhone 16 Pro Max"
require(iphone.name == "iPhone 16 Pro Max")
}
Data class
Les "data classes" s'utilitzen principalment per contenir dades.
El compildor implementa de manera automàtica alguns mètodes que et permet fer un print on es poden veure totes les propietas de l'objecte, comparar i copiar objectes, etc.
Tens més informació a Kotlin - Data classes
Modifica el fitxer App.kt
:
package org.example
fun main() {
class UserNoData(val name: String, val age: Int)
data class User(val name: String, val age: Int)
val eva = UserNoData("Eva", 43)
val david = User("David", 51)
println(eva)
println(david)
}
Executa l'aplicació:
> C:\Users\david\scoop\apps\openjdk21\current\bin\java.exe ... org.example.AppKt
org.example.AppKt$main$UserNoData@9807454
User(name=David, age=51)
Pots veure que el "print" de l'objecte UserNoData
és el tipic d'un objecte (tipus@hash
) mentres que el de l'objecte User
es molt més informatiu.
Si comparo dos usuaris amb les mateixes propietats, el resultat és true
package org.example
fun main() {
data class User(val name: String, val age: Int)
val eva1 = User("Eva", 43)
val eva2 = User("Eva", 43)
require(eva1 == eva2)
}
També puc crear un objecte a partir d'un altre objecte:
package org.example
fun main() {
data class User(val name: String, val age: Int)
val eva = User("Eva", 43)
val esther = eva.copy(name = "Esther")
require(esther.age == 43)
}
Mermaid
Mermaid ens permet crear el nostre diagrama de classes.
Instal.la el plugin Mermaid:
- Ctrl + Alt + S per obrir el menú "Settings"
- Selecciona Plugins
- Busca "Mermaid" i instal.la
Crea un nou fitxer model.mm
.
Modifica el fitxer per crear el model de dades:
Activitat
1.- Modifica el diagrama afegint les classes Order
i Client
.
2.- Crea un nou fitxer Model.kt
amb les classes corresponents.
package org.example
data class Product (val id: Long, var name: String)
data class Client (val id: Long, var name: String)
data class Order(val id: Long)
3.- Modifica el fitxer App.kt
package org.example
fun main() {
val client = Client(1,"David de Mingo")
println(client)
}
Executa el codi
Composició
Un objecte pot estar composat d'altres objectes definits per altres classes.
Per exemple, una persona pot tenir una adreça:
classDiagram direction LR class Address { val street: String val city: String val zipcode: String val country: String = "Spain" } class Person { val id: Long var name: String } Person --> Address
En Kotlin tots són objectes!
Per tant, com que Long
, String
, etc. són objectes, no hi diferència entre els teus objectes i els objectes predefinits per Kotlin.
Modifica el fitxer App.kt
:
package org.example
fun main() {
class Address(
val street: String,
val city: String,
val zipcode: String,
val country: String = "Spain",
)
class Person(
val id: Long,
var name: String,
var address: Address,
)
val david = Person(1, "david", Address("C/Miquel Angel", "Barcelona", "08028"))
require(david.address.city == "Barcelona")
}
Activitat
1.- Modifica el fitxer model.md
amb aquest nou disseny:
classDiagram direction LR class Client { val id: Long var name: String } class Product { val id: Long var name: String val price: Double } class OrderItem { var quantity: Int } OrderItem --> Product class Order { val id: Long } Order --> Client Order --> "1..*" OrderItem
2.- Modifica el fitxer Model.kt
amb les classes corresponents:
TODO