“Const” ve “val” arasındaki fark nedir?


276

Kısa bir süre önce constanahtar kelimeyi okudum ve kafam çok karıştı! Ben arasında herhangi bir fark bulamıyorum constve valanahtar kelime, biz değişmez bir değişkeni yapmak her ikisi de kullanabilirsiniz Yani, özlüyorum o başka orada bir şey mi?



Yanıtlar:


388

consts derleme zamanı sabitleridir. Yani değerlerinin derleme zamanında atanması gerekir, vals'nin aksine çalışma zamanında yapılabilir.

Bu, constbir işleve veya herhangi bir sınıf yapıcısına asla atanamayacağı, sadece bir Stringveya ilkel yapılamayacağı anlamına gelir .

Örneğin:

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

const val bar = "Hello world"           //Also okay

3
Böyle bir şeye ne dersin: const val foo = "Hello world"ve val bar = "Hello world"? Bunlar aynı mı?
Mathew Hany

5
@MathewHany, en azından bayt kodu açısından değil, bkz: stackoverflow.com/questions/37482378/static-data-in-kotlin/…
kısayol tuşu

4
Bence constdeğerler derleme sırasında tamamen sıralı olacak.
Luka Jacobowitz

102
Bu başka bir soruya yalvarır: Kotlin neden const valsadece yerine gerektirir const? Bana öyle geliyor ki, valanahtar kelime bu bağlamda tamamen gereksizdir, çünkü const varyüzünde saçma olur.
Eric Lloyd

18
@EricLloyd İle const val, bir anahtar kelime yerine constbir değiştiricidir val. Değiştiriciler> anahtar kelimeler. Bu aynı tasarımın fazla örnek vardır annotation/enum/data class, private val, inline funvb
Aro

38

Sadece Luka'nın cevabına eklemek için:

Derleme Zamanı Sabiti

Derleme zamanında değeri bilinen özellikler const değiştirici kullanılarak derleme zamanı sabitleri olarak işaretlenebilir. Bu tür özelliklerin aşağıdaki gereksinimleri karşılaması gerekir:

Bu özellikler ek açıklamalarda kullanılabilir.

Kaynak: Resmi belgeler


21

Kotlin'i Java'ya dönüştürebilirsiniz. Sonra const val daha bir statik değiştirici olduğunu görebilirsiniz . Bunun gibi basit kod.

Kotlin:

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

Java'ya (Bölüm):

@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;
   }
}

2
Birisi bu cevabın neden unutulmaya indirgendiğini bir yorumda söyleyebilir mi?
James Jordan Taylor

3
@JamesJordanTaylor I onayladı. Ama sanırım bazı insanlar onu dikkatlice okumadılar ve hızlı bir bakışta bu cevap, konu dışı java'dan kotlin'e nasıl dönüştüğünden bahsediyor gibi görünüyor.
user1032613

2
Ne constkaldırılır, farklı bir Java dosyasını verecektir?
DYS

2
@DYS: Bence "statik" kaldıracak ve sadece genel final olacak String = "merhaba";
Varun Ajay Gupta

5

Her ikisi de valve constdeğişmez.

constderleme zamanı sabitlerini bildirmek için kullanılırken, valçalışma zamanı sabitleri için kullanılır.

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

val PICon = getIP()  // Assignment done at run-time

4

const kotlin'den Java'ya

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

val kotlin'den Java'ya

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

Basit Dilde

  1. Const değişkeninin değeri derleme zamanında bilinir.
  2. Val değeri, çalışma zamanında sabitleri tanımlamak için kullanılır.

Örnek 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"
}

Çünkü getCar () çalışma zamanında değerlendirilir ve değeri Car'a atar.

Bunlara ek olarak -

  1. val salt okunurdur, çalışma zamanında bilinen değişmez anlamına gelir
  2. var çalışma zamanında bilinen değiştirilebilir
  3. const değişmez ve derleme zamanında bilinen değişkenler

3

Kotlin'de constve valher ikisi de değişmezliği ve salt okunur değerleri temsil eder ve java'da finalanahtar kelime olarak hareket eder .

valanahtar kelime, çalışma zamanı değerleri için beyan etmek ve constanahtar kelime derleme zamanı değerleri beyan etmek için kullanılmalıdır.

Unutmayın, const yalnızca işlev ve yapıcılar için değil ilkel veri türleriyle kullanılmalıdır.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.