Classe Kotlin – Costruttore Kotlin

Nel tutorial odierno, discuteremo i concetti di Programmazione Orientata agli Oggetti in Kotlin. Approfondiremo la classe Kotlin nei dettagli, esaminando anche costruttori, modificatori di accesso e classi astratte di Kotlin.

Classe Kotlin

Una classe è una definizione che raggruppa funzioni e proprietà. Le classi in Kotlin vengono definite utilizzando la parola chiave class seguita dal nome della classe. Il corpo va all’interno delle parentesi graffe.

class FirstClass {
}

Un’istanza della classe viene istanziata nel modo seguente:

val firstClass =  FirstClass()
var new = FirstClass() //here new is the name of the var.

Contrariamente a Java, new non è una parola chiave in Kotlin. Le classi per impostazione predefinita sono finali in Kotlin. Quindi, l’equivalente delle definizioni di cui sopra in Java sarebbe qualcosa del genere:

public final class FirstClass {
}

Pertanto, per impostazione predefinita le classi in Kotlin non sono ereditabili. Per rendere una classe non finale, è necessario aggiungere la parola chiave open.

open class Me{
}

La notazione open consente ad altri di ereditare da questa classe.

Esempio di Classe Kotlin

Creiamo una classe con alcune funzioni e una proprietà. Vedremo come accedere alle funzioni e alle proprietà di quella classe. Inoltre, vedremo come impostare le proprietà dei membri.

class User {

    var loggedIn: Boolean = false
    val cantChangeValue = "Hi"
    
    fun logOn() {
        loggedIn = true
    }
    
    fun logOff() {
        loggedIn = false
    }
}

fun main(args: Array<String>) {

    val user = User()
    println(user.loggedIn) //false
    user.logOn()
    println(user.loggedIn) //true
    user.logOff()
    println(user.loggedIn) //false
    user.cantChangeValue = "Hey" //won't compile. Can't modify a final variable.

}

La funzione main appartiene alla classe Test.kt. Per accedere ai membri e alle funzioni, dobbiamo utilizzare l’operatore punto. Una proprietà val non può essere impostata di nuovo utilizzando un operatore punto.

Inizializzazione Kotlin

Il blocco di inizializzazione di Kotlin è definito come mostrato di seguito.

class User {
    
    init{
        print("Class instance is initialised.")
    }

    var loggedIn: Boolean = false
    val cantChangeValue = "Hi"

    fun logOn() {
        loggedIn = true
    }

    fun logOff() {
        loggedIn = false
    }
}

Il codice all’interno del blocco init è il primo ad essere eseguito quando la classe viene istanziata. Il blocco init viene eseguito ogni volta che la classe viene istanziata, con qualsiasi tipo di costruttore come vedremo dopo. Nella classe possono essere scritti più blocchi di inizializzazione. Verranno eseguiti sequenzialmente come mostrato di seguito.

class MultiInit(name: String) {

    init {
        println("First initializer block that prints ${name}")
    }

    init {
        println("Second initializer block that prints ${name.length}")
    }
}

fun main(args: Array) {
    var multiInit = MultiInit("Kotlin")
}

//Segue è stampato nella console di log.
//Primo blocco di inizializzazione che stampa Kotlin
//Secondo blocco di inizializzazione che stampa 6

Le classi Kotlin permettono di stampare le proprietà nella dichiarazione stessa utilizzando la funzione also come mostrato di seguito.

class MultiInit(name: String) {
    val firstProperty = "First property: $name".also(::println)

    init {
        println("First initializer block that prints ${name}")
    }

    val secondProperty = "Second property: ${name.length}".also(::println)

    init {
        println("Second initializer block that prints ${name.length}")
    }
}

fun main(args: Array) {

    var multiInit = MultiInit("Kotlin")
}

//Segue viene stampato.
//Prima proprietà: Kotlin
//Primo blocco di inizializzazione che stampa Kotlin
//Seconda proprietà: 6
//Secondo blocco di inizializzazione che stampa 6

Costruttore Kotlin

I costruttori Kotlin sono funzioni speciali dei membri utilizzate per inizializzare le proprietà. I costruttori in Kotlin sono scritti e strutturati in modo diverso rispetto a Java. Per impostazione predefinita, una classe ha un costruttore vuoto come mostrato di seguito:

class Student {
    var name: String
    val age : Int

    init {
        name = "Anupam"
        age = 24
    }

    init {
        name = "Anupam Chugh"
        //età = 26
    }
}

fun main(args: Array) {
    
    val student = Student()
    println("${student.name} age is ${student.age}")
    student.name = "Your"
    //studente.età = 26 //non compila. L'età è val
    println("${student.name} age is ${student.age}")

}

//Il seguente viene stampato sulla console:
//Anupam Chugh età è 24
//La tua età è 24

Costruttori primari

I costruttori primari in Kotlin sono definiti nell’intestazione della classe stessa come mostrato di seguito.

class User(var name: String, var isAdmin: Boolean) {

    init {
        name = name + " @ JournalDev.com"
        println("Author Name is $name. Is Admin? $isAdmin")
    }
}

La definizione dei costruttori primari va all’interno dell’intestazione della classe. Abbiamo definito i tipi di proprietà (val/var) nel costruttore stesso. Nota: A meno che non sia indicato come var, per impostazione predefinita, gli argomenti del costruttore sono val.

class User(name: String, isAdmin: Boolean)

Nel codice sopra, sia il nome che isAdmin non possono essere riassegnati. In alternativa, possiamo anche assegnare gli argomenti del costruttore alle proprietà dei membri nella classe come mostrato di seguito.

class User(name: String, val isAdmin: Boolean) {

    var username  = name
    val _isAdmin = isAdmin

    init {
        username= username + " @ JournalDev.com"
        println("Author Name is $name. Is Admin? $_isAdmin")
    }
}

fun main(args: Array) {

    var user = User("Anupam",false)
    user.isAdmin = true //won't compile since isAdmin is val
    user._isAdmin = true //won't compile. Same reason.
    user = User("Pankaj",true)
}

//Il seguente viene stampato nella console di log.
//Nome autore è Anupam. È amministratore? falso
//Nome autore è Pankaj. È amministratore? vero

Valori Predefiniti del Costruttore Kotlin

Kotlin ci consente di specificare valori predefiniti direttamente nel costruttore, come mostrato di seguito.

class User(name: String, var website: String = "JournalDev") {

    init {
        println("Author $name writes at $website")
    }

    init {
        website = website + ".com"
        println("Author $name writes at $website")
    }
}

fun main(args: Array) {

    var user = User("Anupam","JournalDev")
    user = User("Pankaj","JournalDev")
}

//Quanto segue viene stampato sulla console:
//L'autore Anupam scrive su JournalDev
//L'autore Anupam scrive su JournalDev.com
//L'autore Pankaj scrive su JournalDev
//L'autore Pankaj scrive su JournalDev.com

Costruttori Secondari

I costruttori secondari sono scritti all’interno del corpo della classe, preceduti dalla parola chiave constructor. L’esempio seguente ne dimostra l’utilizzo.

class Student {
    var name: String
    val age : Int

    constructor(name: String, age: Int)
    {
        this.name = name
        this.age = age
    }

    fun printDetails()
    {
        println("Name is $name and Age is $age")
    }

}

fun main(args: Array) {

    var student = Student("Anupam", 24)
    student.printDetails()
}

//Quanto segue viene stampato sulla console:
//Il nome è Anupam e l'età è 24

L’uso più comune dei costruttori secondari avviene nelle sottoclassi quando è necessario inizializzare la classe in modi diversi. Se la classe contiene un costruttore primario, il costruttore secondario deve fare riferimento ad esso nella sua dichiarazione. La dichiarazione avviene utilizzando la parola chiave this.

class Student(var name: String, val age: Int) {

    var skill: String

    init {
        skill = "NA"
    }

    constructor(name: String, age: Int, skill: String) : this(name, age) {
        this.skill = skill
    }

    fun printDetails() {
        if (skill.equals("NA"))
            println("Name is $name and Age is $age")
        else
            println("Name is $name and Age is $age Skill is $skill")
    }
}

//Quanto segue viene stampato nella console di log:
//Il nome è Anupam e l'età è 24
//Il nome è Anupam e l'età è 24 Skill is Kotlin

Il blocco init viene utilizzato per inizializzare la proprietà membro skill. Il costruttore secondario delega al costruttore primario utilizzando : this.

Getter e Setter personalizzati

Fino ad ora abbiamo accesso e modificato le proprietà in una classe usando l’operatore punto sull’istanza della classe. Utilizziamo la sintassi set e get per vedere come possiamo personalizzare l’accesso.

class Name{
    var post: String = "default"
    set(value) {if(!post.isNotEmpty()) {
        throw IllegalArgumentException(" Enter a valid name")
    }
                field = value
                print(value)
    }

}

fun main(args: Array<String>) {

    var name = Name()
    name.post = "Kotlin Classes"
    name.post = ""
    name.post = "Kotlin Data Classes Our Next Tutorial"


}

Di seguito viene stampato nella console di log:

Kotlin Classes

Exception in thread "main" java.lang.IllegalArgumentException:  Enter a valid name
	at Name.setPost(Test.kt:16)
	at TestKt.main(Test.kt:78)

La variabile field nel setter salva il valore precedente. Aggiungiamo un getter.

class Name{
    var post: String = "default"
    set(value) {if(!post.isNotEmpty()) {
        throw IllegalArgumentException(" Enter a valid name")
    }
                field = value
    }
    get() {
        return field.capitalize()
    }

}

fun main(args: Array) {

    var name = Name()
    name.post = "kotlin classes"
    println(name.post)
    name.post = "kotlin data Classes our next Tutorial"
    println(name.post)

}

// Di seguito viene stampato:
// Classi Kotlin
// Classi di dati Kotlin il nostro prossimo Tutorial

capitalize() rende maiuscola la prima lettera della stringa. Nota: se la proprietà è un val, il metodo set non verrà compilato.

Modificatore di visibilità Kotlin

  • Pubblico : Qualsiasi classe, funzione, proprietà, interfaccia o oggetto che ha questo modificatore è visibile e può essere accesso da qualsiasi punto.
  • Privato: Una classe/funzione definita con questo modificatore può essere accessibile solo all’interno dello stesso file. Un membro/proprietà in una classe/funzione con questo modificatore può essere accessibile solo all’interno di quel blocco.
  • Protetto: Questo modificatore è lo stesso del privato, tranne che permette la visibilità e l’accesso all’interno delle sottoclassi.
  • Interno: Una classe/interfaccia/funzione con questo modificatore è accessibile solo all’interno dello stesso modulo.

I modificatori di visibilità sono applicabili anche ai costruttori. Assegnare un modificatore a un costruttore primario richiede di specificare la parola chiave constructor insieme al costruttore nell’intestazione della classe.

class Student private constructor (var name: String, val age: Int) {

    var skill: String

    init {
        skill = "NA"
    }

    constructor(name: String, age: Int, skill: String) : this(name, age) {
        this.skill = skill
    }

    fun printDetails() {
        if (skill.equals("NA"))
            println("Name is $name and Age is $age")
        else
            println("Name is $name and Age is $age Skill is $skill")
    }
}

fun main(args: Array) {

    var student = Student("Anupam",24,"Kotlin")
    student.printDetails()
}

//prints
//Il nome è Anupam e l'età è 24. Le capacità sono in Kotlin

I costruttori privati non possono essere chiamati al di fuori della classe. Nel codice sopra, possiamo istanziare la classe in una funzione diversa solo utilizzando il costruttore secondario.

Classe Astratta Kotlin

Come in Java, la parola chiave abstract è utilizzata per dichiarare classi astratte in Kotlin. Una classe astratta non può essere istanziata. Tuttavia, può essere ereditata dalle sottoclassi. Per default, i membri di una classe astratta sono non astratti a meno che non sia specificato diversamente.

abstract class Person(name: String) {

    init {
        println("Abstract Class. init block. Person name is $name")
    }

    abstract fun displayAge()
}

class Teacher(name: String): Person(name) {

    var age : Int

    init {
        age = 24
    }

    override fun displayAge() {
        println("Non-abstract class displayAge function overridden. Age is $age")
    }
}

fun main(args: Array) {

    val person = Teacher("Anupam")
    person.displayAge()

}

//Il seguente è stampato nella console.
//Classe astratta. Blocco init. Il nome della persona è Anupam
//Classe non astratta. L'età è 24

Nota: Le classi astratte sono per default open. Quindi aggiungere un modificatore open per consentire la sottoclassificazione non è necessario. La parola chiave override viene utilizzata per sovrascrivere un metodo nella sottoclasse. Abbiamo coperto le basi delle classi Kotlin in questo tutorial. C’è ancora molto altro come Classi Dati, Classi Sigillate, Ereditarietà, ecc. Li affronteremo nei prossimi tutorial. Riferimenti: Documentazione Kotlin

Source:
https://www.digitalocean.com/community/tutorials/kotlin-class-constructor