Kotlin const, var e val Parole chiave

1. Introduzione

In questo tutorial, illustreremo le principali differenze tra le parole chiave const , var e val nel linguaggio Kotlin .

Per contestualizzare queste parole chiave, le confronteremo con i loro equivalenti Java.

2. Comprensione della digitazione

Per comprendere queste parole chiave, dobbiamo comprendere due delle principali categorie di sistemi di tipi che una lingua può seguire: la digitazione manifest e la digitazione dedotta.

2.1. Digitazione manifest

Tutti i linguaggi offrono una gamma di tipi di dati primitivi per memorizzare e manipolare i dati all'interno di un programma. I linguaggi di programmazione che seguono la disciplina di tipizzazione manifest devono avere i loro tipi di dati definiti in modo esplicito all'interno del programma.

Java, fino alla versione 10, segue rigorosamente questa disciplina. Ad esempio, se vogliamo memorizzare un numero all'interno di un programma, dobbiamo definire un tipo di dati come int :

int myVariable = 3;

2.2. Digitazione dedotta

A differenza di Java, Kotlin segue la disciplina di digitazione dedotta . I linguaggi che supportano l'inferenza del tipo rilevano automaticamente i tipi di dati all'interno del programma in fase di compilazione.

Questo rilevamento significa che noi, in quanto sviluppatori, non dobbiamo preoccuparci dei tipi di dati che stiamo utilizzando.

3. var

In primo luogo, inizieremo con var , la parola chiave di Kotlin che rappresenta variabili mutabili e non finali. Una volta inizializzato, siamo liberi di modificare i dati contenuti nella variabile.

Diamo un'occhiata a come funziona:

var myVariable = 1

Dietro le quinte, myVariable viene inizializzato con il tipo di dati Int .

Sebbene Kotlin utilizzi l'inferenza del tipo, abbiamo anche la possibilità di specificare il tipo di dati quando inizializziamo la variabile:

var myVariable: Int = 1

Le variabili dichiarate come un tipo di dati e quindi inizializzate con un valore del tipo errato genereranno un errore:

var myVariable: Int = b //ERROR!

4. val

La parola chiave val di Kotlin funziona in modo molto simile alla parola chiave var , ma con una differenza fondamentale: la variabile è di sola lettura. L'uso di val è molto simile alla dichiarazione di una nuova variabile in Java con la parola chiave final .

Ad esempio, in Kotlin, scriveremmo:

val name: String = "Baeldung"

Mentre in Java, scriveremmo:

final String name = "Baeldung";

Proprio come una variabile finale in Java, a una variabile val in Kotlin deve essere assegnato un valore così come viene dichiarato, o in un costruttore di classi :

class Address(val street: String) { val name: String = "Baeldung" }

5. const

Come val, le variabili definite con la parola chiave const non sono modificabili. La differenza qui è che const viene utilizzato per variabili note in fase di compilazione.

La dichiarazione di una variabile const è molto simile all'uso della parola chiave static in Java.

Vediamo come dichiarare una variabile const in Kotlin:

const val WEBSITE_NAME = "Baeldung"

E il codice analogo scritto in Java sarebbe:

final static String WEBSITE_NAME = "Baeldung";

5.1. Inlining costante

A partire da Kotlin 1.1, il compilatore Kotlin integra i valori const val nelle posizioni in cui vengono utilizzati . Ad esempio, consideriamo un semplice esempio:

const val VALUE: String = "constant" fun main() { println("$VALUE is inlined") }

A prima vista, potremmo pensare che il compilatore Kotlin ottiene un valore di campo statico da una classe e quindi lo concatena con il testo "è inline" . Tuttavia, poiché i valori const sono inline, il compilatore copierà il valore letterale "costante" ovunque venga utilizzata la costante VALUE . Questo inlining costante è molto più efficiente che ottenere un valore statico da una classe .

Per verificare che l'inlining avvenga effettivamente sotto il cofano, possiamo controllare il bytecode. Per prima cosa, dovremmo compilare il file Kotlin usando kotlinc :

$ kotlinc Main.kt

Quindi, usando javap , possiamo dare un'occhiata al bytecode generato:

$ javap -c -p -v MainKt // truncated 0: ldc #16 // String constant is inlined 2: astore_0 3: iconst_0 4: istore_1 5: getstatic #22 // Field java/lang/System.out:Ljava/io/PrintStream; 8: aload_0 9: invokevirtual #28 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V 12: return

Come mostrato sopra, all'indice 0, il valore letterale "costante" viene copiato per la concatenazione. Quindi, non c'è getstatic per recuperare un valore da un campo statico in una classe.

La linea di fondo è che anche se i const val possono sembrare campi statici, non sono implementati come campi finali statici pubblici . In parole povere, const val è solo un'illusione del compilatore.

6. Conclusione

In questo articolo, abbiamo dato una rapida occhiata alla differenza tra la digitazione manifest e inferita.

Quindi, abbiamo esaminato la differenza tra le parole chiave var, val e const di Kotlin .