ฉันเพิ่งอ่านเกี่ยวกับconst
คำหลักและฉันสับสนมาก! ฉันไม่สามารถหาความแตกต่างระหว่างconst
และval
คำหลักได้ฉันหมายความว่าเราสามารถใช้ทั้งสองอย่างนี้เพื่อสร้างตัวแปรที่ไม่เปลี่ยนรูปแบบได้หรือไม่
ฉันเพิ่งอ่านเกี่ยวกับconst
คำหลักและฉันสับสนมาก! ฉันไม่สามารถหาความแตกต่างระหว่างconst
และval
คำหลักได้ฉันหมายความว่าเราสามารถใช้ทั้งสองอย่างนี้เพื่อสร้างตัวแปรที่ไม่เปลี่ยนรูปแบบได้หรือไม่
คำตอบ:
const
s เป็นค่าคงที่เวลาของการคอมไพล์ หมายความว่าค่าของพวกเขาจะต้องได้รับมอบหมายในช่วงเวลารวบรวมซึ่งแตกต่างจากval
s ซึ่งสามารถทำได้ในขณะทำงาน
ซึ่งหมายความว่าconst
s ไม่สามารถถูกกำหนดให้กับฟังก์ชันหรือตัวสร้างคลาสใด ๆ แต่ให้กับ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