Classes i objectes en kotlin¶
Classes¶
- Son finals per defecte
Absència de New¶
No cal posar new
val persona = Persona("Joan")
Constructors més simples¶
Kotlin incorpora el constructor en la capçalera:
class Persona(val nom: String, var edat: Int,x:Int)
Si no s'acompanya var o val, la variable només s'utilitza en el constructor
A Kotlin no cal escriure getters/setters:¶
Es generen automàticament segons val (només lectura) o var (mutable).
Constructor¶
Init executa el codi quan l'objecte es crea:
class Circle(i: Int) {
init {
...
}
}
class Circle {
constructor(i: Int) {
...
}
}
Getters i Setters¶
Es poden sobreescriure els getters i setters per defecte:
class Person(val firstName: String, val lastName:String) {
val fullName:String
get() {
return "$firstName $lastName"
}
}
Herència¶
- Kotlin té herència de classe amb un únic pare (single-parent class inheritance)
- Cada classe té exactament una classe pare, anomenada superclasse
- Cada subclasse hereta tots els membres de la seva superclasse, inclosos els que la superclasse mateixa ha heretat
Classes especials¶
Data class¶
Classe pensada per contenir dades
Generen automàticament:
✔ equals() ✔ hashCode() ✔ toString() ✔ copy() ✔ destructuring
data class Alumne(val nom: String, val edat: Int)
Pair i Triple son dataclasses predefinides:¶
Guarden un parell o tres valors
Accedim a les seves propietat amb .first, .second, .third
val bookAuthor = Pair("Harry Potter", "J.K. Rowling")
println(bookAuthor.first)
Pair té .to per ometre parèntesis
val bookAuth1 = "Harry Potter".to("J. K. Rowling")
val bookAuth2 = "Harry Potter" to "J. K. Rowling"
val map = mapOf(1 to "x", 2 to "y", 3 to "zz")
Enum class¶
Tipus de dada predefinit per a un conjunt de valors
enum class Color(val r: Int, val g: Int, val b: Int) {
RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255)
}
println("" + Color.RED.r + " " + Color.RED.g + " " + Color.RED.b)
Sealed class¶
Característiques:
- Sembla a una enum, però més avançada, amb dades i comportament.
- Una sealed class no es pot estendre fora del mateix fitxer on està definida.
- Això vol dir que totes les subclasses possibles estan controlades i limitades.
sealed class Operacio {
class Suma(val a: Int, val b: Int) : Operacio()
class Resta(val a: Int, val b: Int) : Operacio()
class Quadrat(val a: Int) : Operacio()
}
Les sealed classes serveixen per:
- Restringir el polimorfisme
- Garantir tractament complet a when
- Substituir enums quan es necessita informació
- Fer el codi més segur i expressiu
- Evitar errors inesperats en herències
Són ideals quan sabem tots els casos possibles i no volem que ningú en defineixi de nous.
El compilador ens avisaria si en el when: falta algun cas, o no els posem tots
fun calcula(op: Operacio): Int {
return when(op) {
is Operacio.Suma -> op.a + op.b
is Operacio.Resta -> op.a - op.b
is Operacio.Quadrat -> op.a * op.a
}
}
Interfícies¶
- Proporcionen un contracte al qual les classes s'hi han d'adherir (han d'implementar els métodes)
- Poden contenir implementació per defecte (métodes abstractes i implmenentats)
- Poden heredar d'altres interfícies
- Poden tenir propietats
- Permeten múltiples herències
- Poden contenir membres estàtics en forma de companion objects
interface Shape {
val name:String
fun computeArea() : Double
}
class Circle(val radius:Double) : Shape {
override fun computeArea() = Math.PI * radius * radius
}
val c = Circle(3.0)
println(c.computeArea())
Objectes en Kotlin¶
La paraula object: declara singletons reals
object Configuracio {
val versio = "1.0"
}
Equivalent al patró Singleton en Java, però automàtic:
- instància única
- inicialització garantida
- accessible directament:
println(Configuracio.versio)
Object expressions (objectes anònims)¶
val listener = object : OnClickListener {
override fun onClick() {
println("Click!")
}
}
Companion objects (equivalent a membres estàtics)¶
A Kotlin no existeixen les variables estàtiques de classe (static). En lloc seu, s’utilitza companion object:
class Persona {
companion object {
val MAX_EDAT = 120
}
}
println(Persona.MAX_EDAT)
public class Persona {
public static final int MAX_EDAT = 120;
}