Kata kunci Kotlin const, var, dan val

1. Perkenalan

Dalam tutorial ini, kami akan menjelaskan perbedaan utama antara kata kunci const , var , dan val dalam bahasa Kotlin .

Untuk memasukkan kata kunci ini ke dalam konteks, kami akan membandingkannya dengan padanan Java-nya.

2. Memahami Mengetik

Untuk memahami kata kunci ini, kita harus memahami dua kategori utama sistem tipe yang dapat diikuti oleh suatu bahasa - pengetikan nyata dan pengetikan tersirat.

2.1. Pengetikan Manifes

Semua bahasa menawarkan berbagai tipe data primitif untuk menyimpan dan memanipulasi data di dalam program. Bahasa pemrograman yang mengikuti disiplin pengetikan manifes harus memiliki tipe datanya yang ditentukan secara eksplisit dalam program.

Java, hingga versi 10, secara ketat mengikuti disiplin ini. Sebagai contoh, jika kita ingin menyimpan angka dalam suatu program, kita harus mendefinisikan tipe data seperti int :

int myVariable = 3;

2.2. Pengetikan Tereka

Tidak seperti Java, Kotlin mengikuti disiplin pengetikan yang disimpulkan . Bahasa yang mendukung inferensi tipe secara otomatis mendeteksi tipe data dalam program pada waktu kompilasi.

Deteksi ini berarti bahwa kami, sebagai pengembang, tidak perlu khawatir tentang tipe data yang kami gunakan.

3. var

Pertama, kita akan mulai dengan var , kata kunci Kotlin yang mewakili variabel non-final yang bisa berubah. Setelah diinisialisasi, kami bebas untuk mengubah data yang disimpan oleh variabel.

Mari kita lihat cara kerjanya:

var myVariable = 1

Di balik layar, myVariable diinisialisasi dengan tipe data Int .

Meskipun Kotlin menggunakan tipe inferensi, kami juga memiliki opsi untuk menentukan tipe data saat kami menginisialisasi variabel:

var myVariable: Int = 1

Variabel yang dideklarasikan sebagai satu tipe data dan kemudian diinisialisasi dengan nilai tipe yang salah akan menghasilkan kesalahan:

var myVariable: Int = b //ERROR!

4. val

Kata kunci val Kotlin bekerja hampir sama dengan kata kunci var , tetapi dengan satu perbedaan utama - variabelnya hanya-baca. Penggunaan val adalah seperti mendeklarasikan variabel baru di Jawa dengan akhir kata kunci.

Misalnya, di Kotlin, kami akan menulis:

val name: String = "Baeldung"

Sedangkan di Java, kami akan menulis:

final String name = "Baeldung";

Sama seperti variabel terakhir di Java, variabel val di Kotlin harus diberi nilai seperti yang dideklarasikan, atau dalam konstruktor Kelas :

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

5. const

Seperti val, variabel yang ditentukan dengan kata kunci const tidak dapat diubah. Perbedaannya di sini adalah bahwa const digunakan untuk variabel yang diketahui pada waktu kompilasi.

Mendeklarasikan sebuah variabel const sama seperti menggunakan kata kunci statis di Java.

Mari kita lihat cara mendeklarasikan variabel const di Kotlin:

const val WEBSITE_NAME = "Baeldung"

Dan kode analogi yang ditulis di Java adalah:

final static String WEBSITE_NAME = "Baeldung";

5.1. Inlining Konstan

As of Kotlin 1.1, the Kotlin compiler inlines the const val values into the locations where they're used. For instance, let's consider a simple example:

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

At first glance, we might think that the Kotlin compiler gets a static field value from a class and then concatenates it with the ” is inlined” text. However, since const vals are inlined, the compiler will copy the “constant” literal wherever the VALUE constant is used. This constant inlining is much more efficient than getting a static value from a class.

To verify that the inlining actually happens under-the-hood, we can check out the bytecode. First, we should compile the Kotlin file using kotlinc:

$ kotlinc Main.kt

Then, using javap, we can take a peek at the generated bytecode:

$ 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

As shown above, at index 0, the “constant” literal is copied for concatenation. So, there's no getstatic to a fetch a value from a static field in a class.

The bottom line is that even though the const vals may look like static fields, they're not implemented as public static final fields. Put simply, the const val is just a compiler illusion.

6. Conclusion

Dalam artikel ini, kita telah melihat sekilas perbedaan antara pengetikan manifes dan tersimpul.

Kemudian, kami melihat perbedaan antara kata kunci var, val , dan const Kotlin .