มีกี่วิธีที่คุณสามารถกำหนดค่าคงที่ใน Kotlin
การใช้วัตถุร่วม
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
คุณสามารถใช้วัตถุบล็อกร่วมด้านบนภายในคลาสใดก็ได้และกำหนดเขตข้อมูลทั้งหมดของคุณภายในบล็อกนี้เอง แต่มีปัญหากับวิธีนี้เอกสารระบุว่า
แม้ว่าสมาชิกของออบเจกต์ร่วมจะมีลักษณะเหมือนสมาชิกแบบคงที่ในภาษาอื่น ๆ ในขณะที่ยังคงเป็นสมาชิกอินสแตนซ์ของวัตถุจริงและสามารถใช้อินเทอร์เฟซได้
เมื่อคุณสร้างค่าคงที่โดยใช้ออบเจ็กต์คู่หูและดูโค้ดไบต์ที่ถอดรหัสแล้วคุณจะมีลักษณะดังนี้ด้านล่าง
ClassName.Companion Companion = ClassName.Companion.$$INSTANCE;
@NotNull
String ITEM1 = "item1";
@NotNull
String ITEM2 = "item2";
public static final class Companion {
@NotNull
private static final String ITEM1 = "item1";
@NotNull
public static final String ITEM2 = "item2";
// $FF: synthetic field
static final ClassName.Companion $$INSTANCE;
private Companion() {
}
static {
ClassName.Companion var0 = new ClassName.Companion();
$$INSTANCE = var0;
}
}
จากที่นี่คุณสามารถเห็นสิ่งที่เอกสารกล่าวว่าแม้ว่าสมาชิกของวัตถุที่แสดงร่วมดูเหมือนสมาชิกแบบคงที่ในภาษาอื่น ๆ ณ รันไทม์เหล่านั้นยังคงเป็นสมาชิกของวัตถุจริงมันทำงานพิเศษเกินความต้องการ
ทีนี้ก็มาอีกทางหนึ่งซึ่งเราไม่จำเป็นต้องใช้ออบเจกต์ร่วมเช่นด้านล่าง
object ApiConstants {
val ITEM1: String = "item1"
}
อีกครั้งถ้าคุณเห็นโค้ดตัวอย่างของโค้ดด้านบนที่แปลแล้วคุณจะพบสิ่งนี้
public final class ApiConstants {
private static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
public final String getITEM1() {
return ITEM1;
}
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
CONNECT_TIMEOUT = "item1";
}
}
ตอนนี้ถ้าคุณเห็นโค้ดที่ถูกถอดรหัสข้างต้นมันกำลังสร้างเมธอด get สำหรับแต่ละตัวแปร วิธีการรับนี้ไม่จำเป็นเลย
เพื่อกำจัดวิธีการรับเหล่านี้คุณควรใช้constก่อนวาลเหมือนด้านล่าง
object ApiConstants {
const val ITEM1: String = "item1"
}
ตอนนี้หากคุณเห็นโค้ดข้างต้นที่แปลแล้วคุณจะพบว่าอ่านง่ายกว่าเพราะมันเป็นการแปลงพื้นหลังน้อยที่สุดสำหรับรหัสของคุณ
public final class ApiConstants {
public static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
}
}
ดังนั้นนี่คือวิธีที่ดีที่สุดในการสร้างค่าคงที่
public static final
เขตข้อมูลใน Java ให้ใช้const val
ในวัตถุที่แสดงร่วมของคุณ หากคุณต้องการprivate static final
เขตข้อมูลและผู้ทะเยอทะยานสาธารณะให้ใช้val
ในวัตถุที่แสดงร่วมของคุณ