Apa perbedaan antara “const” dan “val”?

276

Saya baru saja membaca tentang constkata kunci, dan saya sangat bingung! Saya tidak dapat menemukan perbedaan antara constdan valkata kunci, maksud saya kita dapat menggunakan keduanya untuk membuat variabel yang tidak dapat diubah, apakah ada hal lain yang saya lewatkan?

Mathew Hany
sumber

Jawaban:

388

consts adalah konstanta waktu kompilasi. Berarti bahwa nilai mereka harus ditetapkan selama waktu kompilasi, tidak seperti vals, di mana itu dapat dilakukan saat runtime.

Ini berarti, bahwa consts tidak pernah dapat ditugaskan ke fungsi atau konstruktor kelas, tetapi hanya untuk Stringatau primitif.

Sebagai contoh:

const val foo = complexFunctionCall()   //Not okay
val fooVal = complexFunctionCall()  //Okay

const val bar = "Hello world"           //Also okay
Luka Jacobowitz
sumber
3
Bagaimana dengan sesuatu seperti ini: const val foo = "Hello world"dan val bar = "Hello world"? Apakah mereka sama?
Mathew Hany
5
@MathewHany, setidaknya tidak dalam hal bytecode, lihat: stackoverflow.com/questions/37482378/static-data-in-kotlin/…
hotkey
4
Saya pikir constnilai-nilai hanya akan sepenuhnya diuraikan selama kompilasi.
Luka Jacobowitz
102
Ini menimbulkan pertanyaan lain: Mengapa Kotlin menuntut const valalih-alih adil const? Menurut saya, valkata kunci tersebut benar-benar berlebihan dalam konteks ini, karena const varakan absurd di wajahnya.
Eric Lloyd
18
@EricLloyd With const val, constadalah pengubah valdaripada kata kunci. Pengubah> kata kunci. Lebih banyak contoh desain yang sama ini, annotation/enum/data class, private val, inline fun, dll
Aro
38

Hanya untuk menambah jawaban Luka:

Konstanta Kompilasi-Waktu

Properti nilai yang dikenal pada waktu kompilasi dapat ditandai sebagai konstanta waktu kompilasi dengan menggunakan pengubah const. Properti tersebut harus memenuhi persyaratan berikut:

Properti seperti itu dapat digunakan dalam anotasi.

Sumber: Dokumentasi resmi

EPadronU
sumber
21

Anda dapat mengubah Kotlin ke Jawa. Maka Anda dapat melihat const memiliki satu lagi pengubah statis daripada val . Kode sederhana seperti ini.

Kotlin:

const val str = "hello"
class SimplePerson(val name: String, var age: Int)

Ke Jawa (Bagian):

@NotNull
public static final String str = "hello";

public final class SimplePerson {
   @NotNull
   private final String name;
   private int age;

   @NotNull
   public final String getName() {
      return this.name;
   }

   public final int getAge() {
      return this.age;
   }

   public final void setAge(int var1) {
      this.age = var1;
   }

   public SimplePerson(@NotNull String name, int age) {
      Intrinsics.checkParameterIsNotNull(name, "name");
      super();
      this.name = name;
      this.age = age;
   }
}
Jin Wang
sumber
2
Bisakah seseorang menyatakan dalam komentar mengapa jawaban ini diturunkan untuk dilupakan?
James Jordan Taylor
3
@JamesJordanTaylor saya terbalik. Tapi saya berasumsi itu karena beberapa orang tidak membacanya dengan hati-hati, dan sekilas jawaban ini sepertinya berbicara tentang bagaimana mengkonversi dari java ke kotlin, yang akan di luar topik.
user1032613
2
Bagaimana jika constdihapus, apakah akan menghasilkan file Java yang berbeda?
DYS
2
@ DYS: Saya pikir itu akan menghapus "statis" dan itu akan menjadi publik baru String str = "halo";
Varun Ajay Gupta
5

Keduanya valdan consttidak berubah.

constdigunakan untuk mendeklarasikan konstanta waktu kompilasi, sedangkan valuntuk konstanta run-time.

const val VENDOR_NAME = "Kifayat Pashteen"  // Assignment done at compile-time

val PICon = getIP()  // Assignment done at run-time
Kifayat Ullah
sumber
4

const kotlin ke Jawa

const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";

val kotlin ke Jawa

val Car_1 = "BUGATTI"   // final String Car_1 = "BUGATTI";

Dalam Bahasa sederhana

  1. Nilai dari variabel const dikenal pada waktu kompilasi.
  2. Nilai val digunakan untuk mendefinisikan konstanta pada saat run time.

Contoh 1-

const val Car_1 = "BUGATTI"val Car_2 = getCar() ✔    
const val Car_3 = getCar()//Because the function will not get executed at the compile time so it will through error

fun getCar(): String {
    return "BUGATTI"
}

Ini karena getCar () dievaluasi pada waktu berjalan dan memberikan nilai ke Car.

Selain itu -

  1. val read-only berarti tidak berubah yang dikenal pada saat run-time
  2. var bisa berubah yang dikenal saat dijalankan
  3. const tidak dapat diubah dan variabel yang dikenal pada waktu kompilasi
Shivam Tripathi
sumber
3

Di kotlin, constdan valkeduanya mewakili ketidakmampuan dan hanya membaca nilai dan bertindak sebagaifinal kata kunci dalam java.

val kata kunci harus digunakan untuk menyatakan nilai run time dan const kata kunci harus digunakan untuk menyatakan nilai waktu kompilasi.

Perlu diingat, const harus digunakan hanya dengan tipe data primitif bukan untuk fungsi dan konstruktor.

Example -

const val fun1 = anyFunctionOrConstructor() // it is not fine
    val fun2 = anyFunctionOrConstructor() // it is perfectly fine
    
    const val aa = "My String" // it is perfectly fine

Ajay Vishwakarma
sumber