Kotlin

Salve ragazzi!
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

  1. val constBinario=0b10100101
  2. val constEsadecimale=0xFFCC
  3. val constLong=400L
  4. val constDouble=5.3
  5. val constFloat=8.6F
  6. val constBoolean=true
  7. 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

  1. shl(bit) sposta a sinistra i bit mantenedo il segno
  2. shr(bit) sposta a destra i bit mantenedo il segno
  3. ushr(bits) sposta a destra i bit mettendo il segno a 0
  4. and(bits) esegue l’and bit per bit
  5. or(bits) esegue la funzione or
  6. xor(bits) esegue la funzione xor
  7. 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:

  1. Referenziale
  2. 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,ma di Object.
Per ricavare un elemento dall array possiamo scrivere
println(array[2]),ma possiamo scrivere anche println(array.