อะไรคือความแตกต่างระหว่าง "const" และ "val"?


276

ฉันเพิ่งอ่านเกี่ยวกับconstคำหลักและฉันสับสนมาก! ฉันไม่สามารถหาความแตกต่างระหว่างconstและvalคำหลักได้ฉันหมายความว่าเราสามารถใช้ทั้งสองอย่างนี้เพื่อสร้างตัวแปรที่ไม่เปลี่ยนรูปแบบได้หรือไม่



คุณสามารถอ่านบทความนี้android4dev.com/difference-between-var-val-and-const-in-kotlin หรือดูวิดีโอนี้youtube.com/watch?v=DQLrEGqSSI8&t=6s
Lokesh Desai

คำตอบ:


388

consts เป็นค่าคงที่เวลาของการคอมไพล์ หมายความว่าค่าของพวกเขาจะต้องได้รับมอบหมายในช่วงเวลารวบรวมซึ่งแตกต่างจากvals ซึ่งสามารถทำได้ในขณะทำงาน

ซึ่งหมายความว่าconsts ไม่สามารถถูกกำหนดให้กับฟังก์ชันหรือตัวสร้างคลาสใด ๆ แต่ให้กับStringหรือดั้งเดิมเท่านั้น

ตัวอย่างเช่น:

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

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

3
แล้วมีอะไรแบบนี้: const val foo = "Hello world"และval bar = "Hello world"? พวกเขาเหมือนกันหรือไม่
Mathew Hany

5
@MathewHany อย่างน้อยก็ไม่ได้อยู่ในรูปของ bytecode โปรดดู: stackoverflow.com/questions/37482378/static-data-in-kotlin/ …
ฮอตคีย์

4
ฉันคิดว่าconstค่าจะถูกขีดเส้นใต้อย่างสมบูรณ์ระหว่างการรวบรวม
Luka Jacobowitz

102
นี่เป็นอีกคำถาม: ทำไม Kotlin ต้องการconst valแทนที่จะเป็นแค่const? สำหรับฉันแล้วvalคำสำคัญนั้นฟุ่มเฟือยอย่างสิ้นเชิงในบริบทนี้เนื่องจากconst varจะไร้สาระบนใบหน้าของมัน
Eric Lloyd

18
@EricLloyd ด้วยconst val, constเป็นตัวปรับแต่งได้ที่valมากกว่าคำหลัก ตัวดัดแปลง> คำหลัก ตัวอย่างของการออกแบบเดียวกันนี้, annotation/enum/data class, private val, inline funฯลฯ
Aro

38

เพียงเพิ่มคำตอบของ Luka:

ค่าคงที่เวลารวบรวม

คุณสมบัติค่าที่ทราบ ณ เวลารวบรวมสามารถทำเครื่องหมายเป็นค่าคงที่เวลาของการคอมไพล์โดยใช้ตัวดัดแปลง const คุณสมบัติดังกล่าวจำเป็นต้องปฏิบัติตามข้อกำหนดต่อไปนี้:

  • ระดับบนสุดหรือสมาชิกของประกาศวัตถุหรือวัตถุสหาย
  • เริ่มต้นด้วยค่าประเภท String หรือประเภทดั้งเดิม
  • ไม่มีทะเยอทะยานที่กำหนดเอง

คุณสมบัติดังกล่าวสามารถใช้ในการเพิ่มความคิดเห็น

ที่มา: เอกสารอย่างเป็นทางการ


21

คุณสามารถแปลง Kotlin เป็น Java จากนั้นคุณจะเห็นว่าconstมีตัวแก้ไขแบบคงที่มากกว่าval Valรหัสง่าย ๆ แบบนี้

Kotlin:

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

ไปยัง Java (ส่วน):

@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
ใครบางคนสามารถแสดงความคิดเห็นได้ว่าทำไมคำตอบนี้จึงถูกลดทอนลงไป
James Jordan Taylor

3
@JamesJordanTaylor I upvoted แต่ฉันคิดว่าเป็นเพราะบางคนไม่ได้อ่านอย่างระมัดระวังและในเวลาสั้น ๆ คำตอบนี้ดูเหมือนจะพูดถึงวิธีการแปลงจาก java เป็น kotlin ซึ่งจะเป็นหัวข้อ
user1032613

2
จะทำอย่างไรถ้าconstถูกลบมันจะให้ไฟล์ Java อื่นหรือไม่
DYS

2
@DYS: ฉันคิดว่ามันจะลบ "คงที่" และมันจะเป็นเพียงสาธารณะขั้นสุดท้าย String str = "สวัสดี";
Varun Ajay Gupta

5

ทั้งสองvalและconstไม่เปลี่ยนรูป

constถูกใช้เพื่อประกาศค่าคงที่เวลาคอมไพล์ขณะที่ค่าคงที่valเวลาทำงาน

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

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

4

const kotlin ถึง Java

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

val kotlin ไปยัง Java

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

ในภาษาที่เรียบง่าย

  1. ค่าของตัวแปร const เป็นที่รู้จักกันในเวลารวบรวม
  2. ค่าของ val ใช้เพื่อกำหนดค่าคงที่ ณ รันไทม์

ตัวอย่างที่ 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"
}

นี่เป็นเพราะ getCar () ถูกประเมิน ณ รันไทม์และกำหนดค่าให้กับ Car

นอกจากนี้ -

  1. Valเป็นแบบอ่านอย่างเดียวหมายถึงไม่เปลี่ยนรูปที่รู้จักกันในเวลาทำงาน
  2. varไม่แน่นอนที่รู้จักกันในเวลาทำงาน
  3. constเป็นตัวแปรที่ไม่เปลี่ยนแปลงและตัวแปรที่รู้จักกันในเวลารวบรวม

3

ใน kotlin constและvalทั้งคู่แสดงถึงการเปลี่ยนแปลงไม่ได้และอ่านค่าเท่านั้นและทำหน้าที่เป็นfinalคำหลักใน java

valต้องใช้คีย์เวิร์ดเพื่อประกาศค่าเวลาทำงานและconstต้องใช้คีย์เวิร์ดเพื่อประกาศค่าเวลาคอมไพล์

โปรดจำไว้ว่า const ต้องใช้กับชนิดข้อมูลดั้งเดิมเท่านั้นไม่ใช่สำหรับฟังก์ชันและตัวสร้าง

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.