ฉันเพิ่งอ่านเกี่ยวกับconstคำหลักและฉันสับสนมาก! ฉันไม่สามารถหาความแตกต่างระหว่างconstและvalคำหลักได้ฉันหมายความว่าเราสามารถใช้ทั้งสองอย่างนี้เพื่อสร้างตัวแปรที่ไม่เปลี่ยนรูปแบบได้หรือไม่
ฉันเพิ่งอ่านเกี่ยวกับconstคำหลักและฉันสับสนมาก! ฉันไม่สามารถหาความแตกต่างระหว่างconstและvalคำหลักได้ฉันหมายความว่าเราสามารถใช้ทั้งสองอย่างนี้เพื่อสร้างตัวแปรที่ไม่เปลี่ยนรูปแบบได้หรือไม่
คำตอบ:
consts เป็นค่าคงที่เวลาของการคอมไพล์ หมายความว่าค่าของพวกเขาจะต้องได้รับมอบหมายในช่วงเวลารวบรวมซึ่งแตกต่างจากvals ซึ่งสามารถทำได้ในขณะทำงาน
ซึ่งหมายความว่าconsts ไม่สามารถถูกกำหนดให้กับฟังก์ชันหรือตัวสร้างคลาสใด ๆ แต่ให้กับStringหรือดั้งเดิมเท่านั้น
ตัวอย่างเช่น:
const val foo = complexFunctionCall() //Not okay
val fooVal = complexFunctionCall() //Okay
const val bar = "Hello world" //Also okay
const val foo = "Hello world"และval bar = "Hello world"? พวกเขาเหมือนกันหรือไม่
constค่าจะถูกขีดเส้นใต้อย่างสมบูรณ์ระหว่างการรวบรวม
const valแทนที่จะเป็นแค่const? สำหรับฉันแล้วvalคำสำคัญนั้นฟุ่มเฟือยอย่างสิ้นเชิงในบริบทนี้เนื่องจากconst varจะไร้สาระบนใบหน้าของมัน
const val, constเป็นตัวปรับแต่งได้ที่valมากกว่าคำหลัก ตัวดัดแปลง> คำหลัก ตัวอย่างของการออกแบบเดียวกันนี้, annotation/enum/data class, private val, inline funฯลฯ
เพียงเพิ่มคำตอบของ Luka:
ค่าคงที่เวลารวบรวม
คุณสมบัติค่าที่ทราบ ณ เวลารวบรวมสามารถทำเครื่องหมายเป็นค่าคงที่เวลาของการคอมไพล์โดยใช้ตัวดัดแปลง const คุณสมบัติดังกล่าวจำเป็นต้องปฏิบัติตามข้อกำหนดต่อไปนี้:
- ระดับบนสุดหรือสมาชิกของประกาศวัตถุหรือวัตถุสหาย
- เริ่มต้นด้วยค่าประเภท String หรือประเภทดั้งเดิม
- ไม่มีทะเยอทะยานที่กำหนดเอง
คุณสมบัติดังกล่าวสามารถใช้ในการเพิ่มความคิดเห็น
ที่มา: เอกสารอย่างเป็นทางการ
คุณสามารถแปลง 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;
}
}
constถูกลบมันจะให้ไฟล์ Java อื่นหรือไม่
ทั้งสองvalและconstไม่เปลี่ยนรูป
constถูกใช้เพื่อประกาศค่าคงที่เวลาคอมไพล์ขณะที่ค่าคงที่valเวลาทำงาน
const val VENDOR_NAME = "Kifayat Pashteen" // Assignment done at compile-time
val PICon = getIP() // Assignment done at run-time
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 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
นอกจากนี้ -
ใน 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