ภาพรวม
ใน Kotlin มีคีย์เวิร์ดสองตัวสำหรับประกาศตัวแปร: var (mutable) และ val (immutable) การเข้าใจความแตกต่างเป็นพื้นฐานสำคัญของภาษา
ตารางเปรียบเทียบ
| ลักษณะ | var | val |
|---|---|---|
| ความหมาย | Variable (เปลี่ยนแปลงได้) | Value (คงที่/อ่านอย่างเดียว) |
| การกำหนดค่าซ้ำ | ได้หลายครั้ง | ได้เพียงครั้งเดียว (ตอนประกาศ) |
| การ Reassign | ได้ | ไม่ได้ (Compile Error) |
| เหมือนใน Java | ตัวแปรทั่วไป | final variable |
| Thread Safety | ต้องจัดการเอง | ปลอดภัยกว่า (reference ไม่เปลี่ยน) |
ตัวอย่างการใช้งาน
var - เปลี่ยนค่าได้
fun main() {
var name = "Kotlin"
println("ค่าเริ่มต้น: $name") // Kotlin
name = "Android" // ✅ OK
println("หลังเปลี่ยน: $name") // Android
// สามารถเปลี่ยนได้หลายครั้ง
name = "Developer"
name = "Programmer"
}
val - ไม่สามารถเปลี่ยนค่าได้
fun main() {
val site = "tutorialspoint.com"
println("ค่าเริ่มต้น: $site")
// site = "new value" // ❌ Compile Error: Val cannot be reassigned
// แต่ถ้า val เป็น Object ที่ mutable เอง (เช่น List, Object)
val mutableList = mutableListOf(1, 2, 3)
mutableList.add(4) // ✅ OK - เปลี่ยนเนื้อหาใน object ได้
// mutableList = mutableListOf(5) // ❌ Error - ไม่ได้เปลี่ยน reference
}
แนวทางปฏิบัติที่ดี (Best Practices)
- ใช้ val เป็นค่าเริ่มต้น - ประกาศตัวแปรเป็น val เสมอ หากไม่จำเป็นต้องเปลี่ยนค่า
- เปลี่ยนเป็น var ก็ต่อเมื่อจำเป็น - เปลี่ยนก็ต่อเมื่อ logic ต้องการ mutation จริงๆ
- Immutability ช่วยลด Bug - โค้ดอ่านง่าย ปลอดภัยต่อ Thread และง่ายต่อการ Debug
- Functional Style - val ส่งเสริมการเขียนแบบ Functional Programming
กรณีพิเศษ: lateinit var
class Example {
// lateinit ใช้กับ var เท่านั้น (ไม่ใช่ val)
// ต้องเป็น non-null type และ non-primitive
lateinit var name: String
fun init() {
name = "Initialized later"
}
}
สรุป
val = Read-only reference (เหมือน final ใน Java) ใช้เป็นค่าเริ่มต้น
var = Mutable reference ใช้เมื่อจำเป็นต้อง reassign