Kotlin const, var og val Keywords

1. Introduktion

I denne vejledning bliver vi det skitserer de vigtigste forskelle mellem konst, varog val nøgleord på Kotlin-sproget.

For at sætte disse nøgleord i sammenhæng, vil vi være sammenligner dem med deres Java-ækvivalenter.

2. Forståelse af skrivning

For at forstå disse nøgleord er vi nødt til at forstå to af de største kategorier af typesystemer, som et sprog kan følge - manifest typing og udledt typing.

2.1. Manifest typing

Alle sprog tilbyder en række primitive datatyper til at gemme og manipulere data inden for et program. Programmeringssprog, der følger disciplinen for manifesttypning, skal have deres datatyper udtrykkeligt defineret i programmet.

Java, indtil version 10, følger nøje denne disciplin. For eksempel, hvis vi vil gemme et nummer i et program, skal vi definere en datatype som f.eks int:

int myVariable = 3;

2.2. Udledt typning

I modsætning til Java, Kotlin følger den afledte typedisciplin. Sprog, der understøtter typeinferens registrerer automatisk datatyper inden for programmet på kompileringstid.

Denne detektion betyder, at vi som udviklere ikke behøver at bekymre os om de datatyper, vi bruger.

3. var

For det første starter vi med var, Kotlins nøgleord, der repræsenterer mutable, ikke-endelige variabler. Når vi først er initialiseret, kan vi mutere de data, som variablen har.

Lad os se på, hvordan dette fungerer:

var myVariable = 1

Bag scenen, myVariable initialiseres med Int datatype.

Selvom Kotlin bruger typeafledning, vi har også mulighed for at specificere datatypen, når vi initialiserer variablen:

var myVariable: Int = 1

Variabler, der er erklæret som en datatype og derefter initialiseret med en værdi af den forkerte type, vil resultere i en fejl:

var myVariable: Int = b // FEJL!

4. val

Kotlins val nøgleord fungerer meget i det samme som var nøgleord, men med en nøgleforskel - variablen er skrivebeskyttet. Brugen af val er meget som at erklære en ny variabel i Java med endelig nøgleord.

For eksempel i Kotlin ville vi skrive:

val name: String = "Baeldung"

Mens vi i Java ville skrive:

endelig strengnavn = "Baeldung";

Meget som en endelig variabel i Java, a val variabel i Kotlin skal tildeles en værdi, som den er deklareret, eller i en Klasse konstruktør:

klasse Adresse (val street: String) {val name: String = "Baeldung"}

5. konst

Synes godt om val, variabler defineret med konst nøgleord er uforanderlige. Forskellen her er, atkonst bruges til variabler, der er kendt på kompileringstidspunktet.

Erklæring om en variabel konst er meget som at bruge statisk nøgleord i Java.

Lad os se, hvordan man erklærer en konst variabel i Kotlin:

const val WEBSITE_NAME = "Baeldung"

Og den analoge kode skrevet i Java ville være:

endelig statisk streng WEBSITE_NAME = "Baeldung";

5.1. Konstant inline

Fra og med Kotlin 1.1 indretter Kotlin-kompilatoren konst værdier i de placeringer, hvor de bruges. Lad os for eksempel overveje et simpelt eksempel:

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

Ved første øjekast tror vi måske, at Kotlin-kompilatoren får en statisk feltværdi fra en klasse og derefter sammenkæder den med ”Er inline” tekst. Men siden konsts er inline, vil compileren kopiere "konstant" bogstavelig, uanset hvor VÆRDI konstant anvendes. Denne konstante inline er meget mere effektiv end at få en statisk værdi fra en klasse.

For at bekræfte, at indlægningen faktisk sker under emhætten, kan vi tjekke bytekoden. Først skal vi kompilere Kotlin-filen ved hjælp af kotlinc:

$ kotlinc Main.kt

Brug derefter javap, vi kan kigge på den genererede bytecode:

$ javap -c -p -v MainKt // trunkeret 0: ldc # 16 // Strengkonstant er inline 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

Som vist ovenfor, ved indeks 0, er "konstant" bogstavelig kopieres til sammenkædning. Så der er ingen getstatic for at hente en værdi fra et statisk felt i en klasse.

Den nederste linje er, at selvom konsts kan ligne statiske felter, de implementeres ikke som offentlig statisk finale felter. Enkelt sagt, den konst er bare en compiler-illusion.

6. Konklusion

I denne artikel har vi taget et hurtigt kig på forskellen mellem manifest og udledt typing.

Derefter så vi på forskellen mellem Kotlins var,valog konst nøgleord.