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

TODO

https://kotlinlang.org/docs/properties.html