Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
|
kotlin [2024/12/29 12:41] enric_mieza_sanchez [Nullable Objects] |
kotlin [2025/01/07 19:10] (actual) enric_mieza_sanchez |
||
|---|---|---|---|
| Línia 1: | Línia 1: | ||
| + | ~~REVEAL~~ | ||
| ====== Kotlin ====== | ====== Kotlin ====== | ||
| Línia 32: | Línia 33: | ||
| \\ | \\ | ||
| - | ===== val vs var o immutables vs mutables | + | ===== val (immutable) |
| Hi ha 2 paraules claus per definir símbols: | Hi ha 2 paraules claus per definir símbols: | ||
| Línia 50: | Línia 51: | ||
| ^ | ^ | ||
| </ | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== Inferència de tipus ===== | ||
| <WRAP tip> | <WRAP tip> | ||
| Línia 57: | Línia 62: | ||
| </ | </ | ||
| + | Una definició explícita d'una variable (juntament amb una assignació): | ||
| + | <code kotlin> | ||
| + | >>> | ||
| + | >>> | ||
| + | res14: kotlin.Double = 33.3 | ||
| + | </ | ||
| + | Kotlin admet definicions per **inferència del tipus**: | ||
| + | <code kotlin> | ||
| + | >>> | ||
| + | >>> | ||
| + | res20: kotlin.Double = 33.3 | ||
| + | </ | ||
| + | |||
| + | La inferència de tipus ajuda a que el codi sigui menys verbós que Java. Per exemple, per instanciar objectes: | ||
| + | <code kotlin> | ||
| + | var b = Button() | ||
| + | </ | ||
| + | |||
| + | Enlloc del que podria ser en Java: | ||
| + | <code java> | ||
| + | Button b = new Button(); | ||
| + | </ | ||
| \\ | \\ | ||
| - | ===== Nullable | + | ===== Nullable i Non-Nullable Objects |
| - | Kotlin intenta evitar errors de Java en //runtime// com el típic '' | + | Kotlin intenta evitar errors de Java en //runtime// com el típic '' |
| <WRAP info> | <WRAP info> | ||
| - | '' | + | '' |
| </ | </ | ||
| - | Per defecte els tipus son //not-nullable// (Ex: '' | + | Per defecte els tipus son //non-nullable// (Ex: '' |
| <code kotlin> | <code kotlin> | ||
| >>> | >>> | ||
| >>> | >>> | ||
| res87: kotlin.Int = 1 | res87: kotlin.Int = 1 | ||
| - | >>> | + | >>> |
| error: null can not be a value of a non-null type Int | error: null can not be a value of a non-null type Int | ||
| - | a=null | + | a = null |
| - | ^ | + | ^ |
| </ | </ | ||
| Línia 87: | Línia 114: | ||
| </ | </ | ||
| - | Això ens porta a certs " | + | ===== Què fa el compilador amb els nulls? ===== |
| + | Disposar de variables // | ||
| + | <WRAP prewrap> | ||
| <code kotlin> | <code kotlin> | ||
| >>> | >>> | ||
| Línia 96: | Línia 125: | ||
| ^ | ^ | ||
| </ | </ | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| - | ==== Safe functions | + | ===== Safe call ?. ===== |
| - | Com es pot veure, l' | + | Com es pot veure, l' |
| <code kotlin> | <code kotlin> | ||
| >>> | >>> | ||
| Línia 105: | Línia 137: | ||
| </ | </ | ||
| - | Això sí, si el valor de la variable fos //null//, el resultat també ho seria: | + | Això sí, si el valor de la variable fos //null//, el resultat |
| <code kotlin> | <code kotlin> | ||
| >>> | >>> | ||
| Línia 112: | Línia 144: | ||
| </ | </ | ||
| - | ==== Operador !! ==== | + | <WRAP tip> |
| - | Finalment, | + | Emprar //safe calls// evita excepcions '' |
| + | </ | ||
| + | |||
| + | ===== Operador !! ===== | ||
| + | Igualment | ||
| <code kotlin> | <code kotlin> | ||
| Línia 121: | Línia 157: | ||
| at Line_53.< | at Line_53.< | ||
| </ | </ | ||
| + | |||
| + | Sempre ens quedarà el bon clàssic '' | ||
| \\ | \\ | ||
| - | ===== Android View Bindings | + | ===== Elvis Operator ?: ===== |
| - | Items a revisar: | + | {{ :android: |
| - | * val (immutable) vs var (mutable) | + | |
| - | * nullable objects | + | |
| - | * bindings? | + | |
| + | L' | ||
| + | <code kotlin> | ||
| + | >>> | ||
| + | >>> | ||
| + | 0 | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | <WRAP tip> | ||
| + | L' | ||
| + | </ | ||
| + | |||
| + | ==== Equivalent en Java ==== | ||
| + | En Java, caldria fer un codi com aquest: | ||
| + | <code java> | ||
| + | String name = null; | ||
| + | if( name == null ) { | ||
| + | System.out.println(0); | ||
| + | } else { | ||
| + | System.out.println( name.length() ); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Tot i que també hi ha l' | ||
| + | <code java> | ||
| + | String name = null; | ||
| + | int length = (name != null) ? name.length() : 0; | ||
| + | System.out.println(length); | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== lateinit ===== | ||
| + | '' | ||
| + | |||
| + | Per exemple: | ||
| + | <code kotlin> | ||
| + | lateinit var x: String // Variable de tipus String que no s'ha inicialitzat | ||
| + | fun main() { | ||
| + | val y = fes_coses_variades() // realitza diverses accions i inicialitza x | ||
| + | println(x) // Imprimeix el valor de la variable x | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP tip> | ||
| + | '' | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ====== Objectes ===== | ||
| + | |||
| + | Els constructors es defineixen amb la paraula '' | ||
| + | |||
| + | Les **variables i funcions estàtiques** dins de classes son variables que estan definides abans d' | ||
| + | |||
| + | En Kotlin es defineixen dins l' | ||
| + | |||
| + | <code kotlin> | ||
| + | class MyClass { | ||
| + | private val a = 1 | ||
| + | | ||
| + | constructor(valor: | ||
| + | this.a = valor | ||
| + | } | ||
| + | |||
| + | companion object { | ||
| + | private val myStaticVar = 10 | ||
| + | | ||
| + | fun myStaticFunction() { | ||
| + | // ... | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||