Anche se qualcuno e’ scettico ormai Kotlin e’ gia’ una realta’.
Si..! Il nuovo linguaggio prendera’ il posto di Java.Perche..? Perche’ nelle guide ufficiali di android e’ affiancato a Java ed e’ la prima scelta.
E allora non ci resta che capire come e’ strutturato :
-Inziamo dalla variabili.
Le Variabili
In Kotlin esistono due tipi di variabili :
- val
- var
La parola chiave val
La parola chiave val indica al compilatore che la variabile che andremo a dichiarare non puo’ cambiare il suo valore nel corso di elaborazione del programma.
Sono quelle vaiabili che in altri linguaggi le definiamo “costanti”
Quindi se scriviamo “val a=10” e poi “a=3” il compilatore dara’ errore.
Andiamo a verificare con il nostro compilatore Kotlin onLine
all indirizzo:https://kotlinlang.org TRY ONLINE
La parola chiave var
La parola chiave var indica al compilatore che la variabile che andremo a dichiarare puo’ cambiare il suo valore nel corso di elaborazione del programma.
andiamo allora a definire la variabile “s” nel seguente modo
var s:Int=5 dove Int definisce il tipo di variabile Integer mentre s e’ la nostra variabile.
Poiche’ in Kotlin tutto e’ un oggetto la precedente notazione equival a Integer s =new Integer(5) in Java.
I tipi Principali
- val constBinario=0b10100101
- val constEsadecimale=0xFFCC
- val constLong=400L
- val constDouble=5.3
- val constFloat=8.6F
- val constBoolean=true
- val constChar=’cf’
In Java una variabile s di tipo int poteva diventare Long.
In Kotlin questo non e’ possibile ,una variabile s di tipo int puo’ diventare Long servendosi dei metodi “toXXX()” che tutti i tipi di Kotlin hanno eccetto Boolean e quindi : s.toLong()
Il Tipo Boolean
In kotlin alcuni simboli boolean | & ! ^ non sono ammessi al loro posto vannoval usati i simboli or and not e xor
Una differenza che non e’ solo formale ma sostanziale,perche’ in kotlin le due condizioni vengono esaminate entrambe.
Infatti val c=a or b viene valutata sia a che b,mentre
in Java c=a|b se a e’ vera b non viene valutata
Operatori bit per bit
anche qui qualcosa e’ cambiato rispetto a Java
- shl(bit) sposta a sinistra i bit mantenedo il segno
- shr(bit) sposta a destra i bit mantenedo il segno
- ushr(bits) sposta a destra i bit mettendo il segno a 0
- and(bits) esegue l’and bit per bit
- or(bits) esegue la funzione or
- xor(bits) esegue la funzione xor
- inv(bits) esegue la funzione not
esempio val dato =0xfc shl 2
sposta 2 bit a sinistra
Valore null in Kotlin
In Kotlin e’ stata fatta molto attenzione a gestire il valore
null per evitare eccezioni ed errori in runtime.
infatti la definizione di variabile var a:int=null non e’
possibile per far si che a possa assumere un valore null
dobbiamo scrivere in questo modo var a:Int?=null inserire
un punto interrogativo.
Ma non e’ finita qui perche’ qualora “a” avesse dei metodi o funzioni per evitare un errore potremos scrivere a.?metodo1.?metodo2 che sta a significare che l’ espressione e’ vera solo
se nessun elemento e’ nullo.
Equivalenze in Kotlin
Esistono due tipi di equivalenze:
- Referenziale
- Strutturale
La prima si esprime con il simbolo==
La seconda si esprime con il simbolo===
La prima esprime l’equivalenza di due variabili che
si riferiscono alla stessa istanza di classe ad esempio
var a=Classe1(“datodainviare”)
var b=a
val sonouguali = a==b
println(sonouguali) dara’ true
La seconda
var a=Classe1(“datodainviare”)
var b=Classe2(“datodainviare”)
val sonouguali = a===b
println(sonouguali) dara’ false perche’ sono due istanze
diverse anche se possiamo ritenerle a tutti gli effetti
strutturalmente equivalenti.
Per ovviare a questo problema si antepone davanti alla classe
la parola chiave data
data Classe1(var name:String)
Valore null in Kotlin
In Kotlin nessuna variabile o costante puo’ assumere valore null
a meno che non lo si dichiari esplicitamente con un punto interrogativo come in questo esempio:
fun main(args:Array
var a:String?="Ciro"
// args[0]="a"
if(args.size>0){println("hello world!"+args[0])}
println("hello world!"+a)
a=null
println("hello world!"+a)
}
Parola chiave data
Osserviamo questo codice:
fun main(args:Array
var saluto1=Classe1("ciro")
var saluto2=Classe1("ciro")
val sonouguali =saluto1===saluto2
println(sonouguali)
}
class Classe1(val name: String) {
public fun saluta1(){
println("Hello, ${name}")
}}
class Classe2(val name: String) {
fun saluta2() {
println("Hello, ${name}")
}
}
Nonostante che la classe sia la stessa il linguaggio interpreta i due risultati come diversi ,anche se noi ci saremo aspettati true.Questo perche’ il compilatore interpreta le due operazioni come istanze diverse.infatti in quest’altro esempio sara’ true
fun main(args:Array
var saluto1=Classe1("ciro")
var saluto2=saluto1
val sonouguali =saluto1==saluto2
println(sonouguali)
}
class Classe1(val name: String) {
public fun saluta1(){
println("Hello, ${name}")
}}
class Classe2(val name: String) {
fun saluta2() {
println("Hello, ${name}")
}
}
Tuttavia in alcuni casi ci servirebbe considerare uguali oggetti instanziati dalla stessa classe avente gli stessi parametri.In questo caso ci viene in aiuto la parola chiave data
che anteponiamo davanti a Classe1 e il seguente codice dara’ truefun main(args:Array
var saluto1=Classe1("ciro")
var saluto2=Classe1("ciro")
val sonouguali =saluto1==saluto2
println(sonouguali)
}
data class Classe1(val name: String, var age: Int) {
constructor(name: String) : this(name, 0)
}
Le Classi in Kotlin
Le classi in Kotlin sono dichiarate dall parola chiave
“class” cosi’ con class Classe2
abbiamo dichiarato una classe.
Ogni Classe Kotlin ha tre funzioni
- toString()
- equals(x)
- hashCode()
cosi avremo:fun main(args:Array
var saluto1=Classe1("ciro")
var saluto2=Classe1("ciro")
val sonouguali =saluto1==saluto2
println(sonouguali)
val oggetto=Classe2()
val oggetto1=Classe2()
println(oggetto.toString())
println( oggetto.equals(oggetto1))
println( oggetto.equals(oggetto))
println( oggetto.hashCode())
println( oggetto1.hashCode())
println( oggetto.hashCode())
}
data class Classe1(val name: String, var age: Int) {
constructor(name: String) : this(name, 0)
}
class Classe2
Classe2 puo’ avere delle proprieta’,cosi
Classe2(){
var nome:String="Ciro"
var eta:int=2
}
e quindi :
fun main(args:Array
var saluto1=Classe1("ciro")
var saluto2=Classe1("ciro")
val sonouguali =saluto1==saluto2
println(sonouguali)
val oggetto=Classe2()
val oggetto1=Classe2()
println(oggetto.toString())
println( oggetto.equals(oggetto1))
println( oggetto.equals(oggetto))
println( oggetto.hashCode())
println( oggetto1.hashCode())
println( oggetto.hashCode())
println( oggetto.nome)
println( oggetto.eta)
oggetto.eta=45
println( oggetto.eta)
}
data class Classe1(val name: String, var age: Int) {
constructor(name: String) : this(name, 0)
}
class Classe2(){
var nome:String="Ciro"
var eta:Int=2
}
class Person(firstName: String, lastName: String, yearOfBirth: Int) {
val fullName = "$firstName $lastName"
var age: Int
init {
age = 2018 - yearOfBirth
}
}
Come si puo’ vedere sopra compare la parola chiave init
essa serve a modificare i valori delle proprieta’
Costruttori di Kotlin
Una classe Kotlin puo’ avere piu’ costruttori
infatti eseguiamo il codice:fun main(args:Array
var saluto1=Classe1("ciro")
var saluto2=Classe1("ciro")
val sonouguali =saluto1==saluto2
println(sonouguali)
val oggetto=Classe2()
val oggetto1=Classe2()
println(oggetto.toString())
println( oggetto.equals(oggetto1))
println( oggetto.equals(oggetto))
println( oggetto.hashCode())
println( oggetto1.hashCode())
println( oggetto.hashCode())
println( oggetto.nome)
println( oggetto.eta)
oggetto.eta=45
println( oggetto.eta)
var persona=Classe1(43,"Ciro")
println( persona.name)
println( persona.age)
}
data class Classe1(val name: String, var age: Int) {
constructor(name: String) : this(name, 0)
constructor(eta:Int,name:String) : this(name, 2019 - eta)
}
class Classe2(){
var nome:String="Ciro"
var eta:Int=2
}
class Person(firstName: String, lastName: String, annoDiNascita: Int) {
val fullName = "$firstName $lastName"
var age: Int
init {
age = 2018 - annoDiNascita
}
}
Setter e Getter
Da fare
Le funzioni
Le funzioni sono identificate dalla parola chiave “fun”
cosi’ avremo: fun presentati(){
println(“Sono $nome”)}
le funzioni possono essere assegnate anche con il segno uguale “=” cosi avremo
fun saluto(altronome:Classe1)=println("Salve, ${altronome.name },sono $name")
ed ecco il codice completo:fun main(args:Array
var saluto1=Classe1("ciro")
var saluto2=Classe1("ciro")
val sonouguali =saluto1==saluto2
println(sonouguali)
val oggetto=Classe2()
val oggetto1=Classe2()
println(oggetto.toString())
println( oggetto.equals(oggetto1))
println( oggetto.equals(oggetto))
println( oggetto.hashCode())
println( oggetto1.hashCode())
println( oggetto.hashCode())
println( oggetto.nome)
println( oggetto.eta)
oggetto.eta=45
println( oggetto.eta)
var persona=Classe1(43,"Ciro")
println( persona.name)
println( persona.age)
val p = Classe1("Ciro")
p.presentati()
p.saluto(Classe1("Osvaldo"))
}
data class Classe1(val name: String, var age: Int) {
constructor(name: String) : this(name, 0)
constructor(eta:Int,name:String) : this(name, 2019 - eta)
fun presentati(){
println("Sono $name")}
fun saluto(altronome:Classe1)=println("Salve, ${altronome.name },sono $name")
}
class Classe2(){
var nome:String="Ciro"
var eta:Int=2
}
class Person(firstName: String, lastName: String, yearOfBirth: Int) {
val fullName = "$firstName $lastName"
var age: Int
init {
age = 2018 - yearOfBirth
}
}
Gli array in Kotlin
In Java ogni array e’ un oggetto e quindi dispone di tutti i metodi e proprieta’ della classe Object.
int[] array=new int[34]
In Kotlin ogni array e’ un istanza della classe ARRAY
dove T e’ il tipo generico della classe.Cosi’ per definire un array di interi scriveremo
var array =IntArray(34)
per riempire l’array useremo la seguente notazione:
var array=arrayOf(1,4,5,6)
ma e’ possibile riempire l’array anche con la seguente notazione:
var array= arrayOf(1,"due",3,"quattro")
ovviamente in quiesto caso array non e’ un istanza di Array
Per ricavare un elemento dall array possiamo scrivere
println(array[2]),ma possiamo scrivere anche println(array.