data class ใน Kotlin เป็นคลาสชนิดพิเศษที่ออกแบบมาเพื่อเก็บข้อมูลโดยเฉพาะ คอมไพเลอร์จะสร้างเมธอด equals, hashCode, toString, copy และ componentN โดยอัตโนมัติตามคุณสมบัติที่ระบุในคอนสตรักเตอร์หลัก ตามเอกสารของ JetBrains (2026) data class ช่วยลดโค้ดเทมเพลตได้ 50–70% เมื่อเทียบกับ Java และเป็นพื้นฐานสำหรับ value objects ในโปรเจกต์ Kotlin
ประเด็นสำคัญ
data class คือโครงสร้างไวยากรณ์ของ Kotlin ที่สร้างเมธอดมาตรฐานโดยอัตโนมัติสำหรับคลาสที่มีวัตถุประสงค์หลักคือการเก็บข้อมูล เมื่อประกาศ data class คอมไพเลอร์จะสร้างการใช้งาน equals, hashCode, toString, copy และ componentN ตามคุณสมบัติทั้งหมดจากคอนสตรักเตอร์หลัก
แตกต่างจากคลาสทั่วไปใน Java ที่นักพัฒนาต้องเขียน getter, setter, equals, hashCode และ toString ด้วยตนเองโดยใช้ IDE หรือไลบรารีอย่าง Lombok Kotlin มีกลไก ในตัว ซึ่งไม่เพียงลดโค้ดแต่ยังรับประกันความสอดคล้อง — เมธอดอัตโนมัติจะตรงกับโครงสร้างคุณสมบัติปัจจุบันเสมอ
ตามแบบสำรวจ JetBrains Kotlin (2025) data class ถูกใช้ใน 78% ของโปรเจกต์ Kotlin ทำให้เป็นหนึ่งในคุณสมบัติที่ต้องการมากที่สุดของภาษา โดยเฉพาะอย่างยิ่งเป็นที่นิยมในสถาปัตยกรรมที่มี DTO โมเดลตอบกลับ API และ state objects ใน MVVM
data class ถูกประกาศด้วยคำสำคัญ data นำหน้า class คุณสมบัติทั้งหมดที่มีส่วนร่วมในเมธอดอัตโนมัติจะถูกระบุในคอนสตรักเตอร์หลัก
data class User(
val id: Int,
val name: String,
val email: String
)
โค้ดหนึ่งบรรทัดแทนที่โค้ดเทมเพลตหลายสิบบรรทัดใน Java คอมไพเลอร์สร้าง equals, hashCode, toString, copy และ component1–component3 สำหรับคุณสมบัติทั้งสาม
เมธอด อัตโนมัติ จะรวมเฉพาะคุณสมบัติจากคอนสตรักเตอร์หลักเท่านั้น หากประกาศคุณสมบัติในเนื้อหาของคลาส มันจะไม่มีส่วนร่วมใน equals, hashCode, toString และ copy
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice is NOT included in equals/hashCode/copy
}
คอนสตรักเตอร์หลักของ data class ต้องมีพารามิเตอร์อย่างน้อยหนึ่งตัว พารามิเตอร์ทั้งหมดต้องถูกทำเครื่องหมายเป็น val หรือ var ไม่สามารถใช้ตัวปรับแต่ง open, abstract, sealed หรือ inner สำหรับ data class
equals และ hashCode ถูกสร้างตามค่าของคุณสมบัติทั้งหมดจากคอนสตรักเตอร์หลัก สองอินสแตนซ์ของ data class จะถือว่าเท่ากันหากคุณสมบัติที่ตรงกันทั้งหมดเท่ากัน
ใน Java การเปรียบเทียบวัตถุโดยค่าเริ่มต้นคือการเปรียบเทียบการอ้างอิง (==) การเปรียบเทียบตามค่าต้องมีการแทนที่ equals Kotlin data class ทำสิ่งนี้โดยอัตโนมัติ ทำให้สามารถใช้ == สำหรับการเปรียบเทียบเชิงโครงสร้าง
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // true
เมธอด toString ส่งคืนการแสดงวัตถุที่อ่านได้พร้อมชื่อและค่าของคุณสมบัติทั้งหมด ซึ่งช่วยให้การบันทึกและการดีบักง่ายขึ้นอย่างมากเมื่อเทียบกับ Java ซึ่งเอาต์พุตเริ่มต้นจะแสดงรหัส แฮช ในรูปแบบเลขฐานสิบหก
ตาม เอกสาร Kotlin (2026) toString ของ data class มีรูปแบบ: “User(id=1, name=John, email=john@example.com)” เมื่อลบคุณสมบัติออกจากคอนสตรักเตอร์หลัก toString จะถูกอัปเดตโดยอัตโนมัติ — ความเสี่ยงของการไม่ซิงค์กันจะถูกกำจัด
copy เป็นหนึ่งในคุณสมบัติสำคัญของ data class มันสร้างสำเนาแบบตื้นของวัตถุพร้อมความสามารถในการเปลี่ยนค่าของคุณสมบัติที่ระบุ
data class Order(
val id: Long,
val status: String,
val amount: Double
)
val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = "Confirmed"
copy ขาดไม่ได้ในสไตล์เชิงฟังก์ชันและสถาปัตยกรรมที่ไม่เปลี่ยนสภาพ (immutability) แทนที่จะเปลี่ยนแปลงวัตถุที่มีอยู่ จะสร้างสำเนาใหม่พร้อมฟิลด์ที่ปรับเปลี่ยน ทำให้โค้ดคาดเดาได้ง่ายขึ้นและปลอดภัยในสถานการณ์ หลายเธรด
data class จะสร้างฟังก์ชัน component1, component2 และอื่นๆ โดยอัตโนมัติสำหรับแต่ละคุณสมบัติตามลำดับการประกาศ ซึ่งช่วยให้สามารถแยกโครงสร้างวัตถุเป็นตัวแปรได้
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)") // "1: Alice (alice@example.com)"
การแยกโครงสร้างยังทำงานใน lambda และลูป for-each ทำให้ data class สะดวกสำหรับการทำงานกับคอลเล็กชัน
ข้อจำกัดแรก — data class ไม่สนับสนุนการสืบทอดจาก data class อื่น สามารถสืบทอดได้จากคลาสทั่วไปหรืออินเทอร์เฟซเท่านั้น
ข้อสอง — เมธอดอัตโนมัติจะรวมเฉพาะคุณสมบัติของคอนสตรักเตอร์หลักเท่านั้น คุณสมบัติในเนื้อหาคลาสจะถูกละเว้น ซึ่งอาจนำไปสู่ equals ที่ไม่ถูกต้องหากคุณลืมสิ่งนี้
ข้อสาม — data class ไม่สามารถเป็น open, abstract, sealed หรือ inner มันเป็น final เสมอ
ข้อสี่ — สำหรับคอลเล็กชันภายใน data class copy จะทำการคัดลอกแบบตื้น การเปลี่ยนแปลงองค์ประกอบภายในคอลเล็กชันที่ถูกคัดลอกจะส่งผลต่อต้นฉบับ
ตาม แนวทางปฏิบัติที่ดีที่สุดของ Kotlin (2026) data class เหมาะสมที่สุดสำหรับ DTO, โมเดล API, value objects และ state objects สำหรับคอมโพเนนต์ที่มีตรรกะทางธุรกิจ แนะนำให้ใช้คลาสทั่วไป
คำถามที่พบบ่อย
ไม่ data class ไม่สามารถสืบทอด data class อื่นได้ อย่างไรก็ตาม มันสามารถสืบทอดคลาสทั่วไปหรือ implement อินเทอร์เฟซได้
อย่างน้อยหนึ่งคุณสมบัติ จำนวนสูงสุดไม่จำกัด แต่ componentN ถูกสร้างขึ้นสำหรับการแยกโครงสร้าง
ไม่ เมธอดอัตโนมัติจะพิจารณาเฉพาะคุณสมบัติจากคอนสตรักเตอร์หลักเท่านั้น คุณสมบัติจากเนื้อหาคลาสไม่มีส่วนร่วมใน equals, hashCode, toString และ copy
ใช่ คุณสามารถแทนที่ equals, hashCode หรือ toString ในเนื้อหาของ data class ได้ ในกรณีนี้ คอมไพเลอร์จะไม่สร้างการใช้งานของตัวเอง
data class จะสร้าง equals, hashCode, toString, copy และ componentN โดยอัตโนมัติ คลาสทั่วไปไม่มีเมธอดเหล่านี้หากไม่มีการ implement ด้วยตนเอง
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม