Kata kunci Kotlin const, var, dan val

1. Pengenalan

Dalam tutorial ini, kita akan menggariskan perbezaan utama antara kata kunci const , var , dan val dalam bahasa Kotlin .

Untuk memasukkan kata kunci ini ke dalam konteks, kami akan membandingkannya dengan setara Java mereka.

2. Memahami Menaip

Untuk memahami kata kunci ini, kita harus memahami dua kategori utama sistem jenis yang boleh diikuti oleh bahasa - menaip manifes dan menaip kesimpulan.

2.1. Menaip Manifest

Semua bahasa menawarkan pelbagai jenis data primitif untuk menyimpan dan memanipulasi data dalam program. Bahasa pengaturcaraan yang mengikuti disiplin menaip manifes mesti mempunyai jenis datanya yang dinyatakan secara jelas dalam program.

Java, sehingga versi 10, mengikut peraturan ini. Sebagai contoh, jika kita ingin menyimpan nombor dalam program, kita mesti menentukan jenis data seperti int :

int myVariable = 3;

2.2. Menaip Kesimpulan

Tidak seperti Java, Kotlin mengikuti disiplin menaip yang disimpulkan . Bahasa yang menyokong inferensi jenis secara automatik mengesan jenis data dalam program pada waktu kompilasi.

Pengesanan ini bermaksud bahawa kita, sebagai pembangun, tidak perlu bimbang tentang jenis data yang kita gunakan.

3. var

Pertama, kita akan bermula dengan var , kata kunci Kotlin yang mewakili yg mungkin berubah, pembolehubah bukan akhir. Setelah dimulakan, kami bebas untuk mengubah data yang dimiliki oleh pemboleh ubah.

Mari lihat bagaimana ini berfungsi:

var myVariable = 1

Di sebalik tabir, myVariable memulakan dengan jenis data Int .

Walaupun Kotlin menggunakan inferensi jenis, kami juga mempunyai pilihan untuk menentukan jenis data ketika kami memulakan pemboleh ubah:

var myVariable: Int = 1

Pemboleh ubah dinyatakan sebagai satu jenis data dan kemudian diinisialisasi dengan nilai jenis yang salah akan menghasilkan ralat:

var myVariable: Int = b //ERROR!

4. val

Kata kunci val Kotlin berfungsi sama seperti kata kunci var , tetapi dengan satu perbezaan utama - pemboleh ubahnya hanya boleh dibaca. Penggunaan val adalah sama seperti mengisytiharkan pembolehubah baru di Jawa dengan akhir kata kunci.

Sebagai contoh, di Kotlin, kami menulis:

val name: String = "Baeldung"

Manakala di Jawa, kita menulis:

final String name = "Baeldung";

Sama seperti pemboleh ubah akhir di Java, pemboleh ubah val di Kotlin mesti diberi nilai seperti yang dinyatakan, atau dalam pembina Kelas :

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

5. konst

Seperti val, pemboleh ubah yang ditentukan dengan kata kunci const tidak berubah. Perbezaannya di sini ialah const digunakan untuk pemboleh ubah yang diketahui pada waktu kompilasi.

Mengisytiharkan pembolehubah malar adalah sama seperti menggunakan statik kata kunci di Jawa.

Mari lihat bagaimana menyatakan pemboleh ubah const di Kotlin:

const val WEBSITE_NAME = "Baeldung"

Dan kod analog yang ditulis di Jawa adalah:

final static String WEBSITE_NAME = "Baeldung";

5.1. Inlining Terus

Sehingga Kotlin 1.1, pengkompil Kotlin yang inlines yang val const nilai ke lokasi di mana ia digunakan . Sebagai contoh, mari kita pertimbangkan contoh mudah:

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

Pada pandangan pertama, kami mungkin berfikir bahawa penyusun Kotlin mendapat nilai medan statik dari kelas dan kemudian menggabungkannya dengan teks "disisipkan" . Namun, kerana const val s diselaraskan, penyusun akan menyalin literal "malar" di mana sahaja pemalar NILAI digunakan. Inlining berterusan ini jauh lebih efisien daripada mendapatkan nilai statik dari kelas .

Untuk mengesahkan bahawa inlining sebenarnya berlaku di bawah tenda, kita boleh melihat kod bytec. Pertama, kita harus menyusun fail Kotlin menggunakan kotlinc :

$ kotlinc Main.kt

Kemudian, dengan menggunakan javap , kita dapat melihat pada bytecode yang dihasilkan:

$ 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

Seperti yang ditunjukkan di atas, pada indeks 0, literal "tetap" disalin untuk penggabungan. Jadi, tidak ada getstatic kepada mengambil nilai dari medan statik dalam kelas.

Intinya adalah bahawa walaupun konstanta kelihatan seperti medan statik, ia tidak dilaksanakan sebagai medan akhir statik awam . Ringkasnya, const val hanyalah ilusi penyusun.

6. Kesimpulannya

Dalam artikel ini, kami telah melihat dengan cepat perbezaan antara menaip manifes dan kesimpulan.

Kemudian, kami melihat perbezaan antara kata kunci Var, val , dan const Kotlin .