data class ใน Kotlin — คืออะไร ไวยากรณ์และคุณสมบัติของคลาสข้อมูล

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-06-20 เวลาอ่าน: 10 นาที

data class ใน Kotlin เป็นคลาสชนิดพิเศษที่ออกแบบมาเพื่อเก็บข้อมูลโดยเฉพาะ คอมไพเลอร์จะสร้างเมธอด equals, hashCode, toString, copy และ componentN โดยอัตโนมัติตามคุณสมบัติที่ระบุในคอนสตรักเตอร์หลัก ตามเอกสารของ JetBrains (2026) data class ช่วยลดโค้ดเทมเพลตได้ 50–70% เมื่อเทียบกับ Java และเป็นพื้นฐานสำหรับ value objects ในโปรเจกต์ Kotlin

ประเด็นสำคัญ

  • data — คำหลักสำหรับประกาศคลาสข้อมูลใน Kotlin
  • equals และ hashCode — ถูกสร้างโดยอัตโนมัติตามคุณสมบัติทั้งหมดของคอนสตรักเตอร์หลัก
  • copy — ฟังก์ชันคัดลอกแบบตื้นพร้อมความสามารถในการแทนที่ฟิลด์แต่ละรายการ
  • componentN — การแยก data class ออกเป็นตัวแปรแต่ละตัว
  • คอนสตรักเตอร์หลักต้องมีพารามิเตอร์ val หรือ var อย่างน้อยหนึ่งตัว

data class ใน 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 คุณสมบัติทั้งหมดที่มีส่วนร่วมในเมธอดอัตโนมัติจะถูกระบุในคอนสตรักเตอร์หลัก

kotlin
data class User(
    val id: Int,
    val name: String,
    val email: String
)

โค้ดหนึ่งบรรทัดแทนที่โค้ดเทมเพลตหลายสิบบรรทัดใน Java คอมไพเลอร์สร้าง equals, hashCode, toString, copy และ component1–component3 สำหรับคุณสมบัติทั้งสาม

คุณสมบัตินอกคอนสตรักเตอร์หลัก

เมธอด อัตโนมัติ จะรวมเฉพาะคุณสมบัติจากคอนสตรักเตอร์หลักเท่านั้น หากประกาศคุณสมบัติในเนื้อหาของคลาส มันจะไม่มีส่วนร่วมใน equals, hashCode, toString และ copy

kotlin
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 และ toString

equals และ hashCode ถูกสร้างตามค่าของคุณสมบัติทั้งหมดจากคอนสตรักเตอร์หลัก สองอินสแตนซ์ของ data class จะถือว่าเท่ากันหากคุณสมบัติที่ตรงกันทั้งหมดเท่ากัน

equals สำหรับการเปรียบเทียบค่า

ใน Java การเปรียบเทียบวัตถุโดยค่าเริ่มต้นคือการเปรียบเทียบการอ้างอิง (==) การเปรียบเทียบตามค่าต้องมีการแทนที่ equals Kotlin data class ทำสิ่งนี้โดยอัตโนมัติ ทำให้สามารถใช้ == สำหรับการเปรียบเทียบเชิงโครงสร้าง

kotlin
data class Address(
    val city: String,
    val street: String
)

val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2)  // true

toString สำหรับการดีบัก

เมธอด toString ส่งคืนการแสดงวัตถุที่อ่านได้พร้อมชื่อและค่าของคุณสมบัติทั้งหมด ซึ่งช่วยให้การบันทึกและการดีบักง่ายขึ้นอย่างมากเมื่อเทียบกับ Java ซึ่งเอาต์พุตเริ่มต้นจะแสดงรหัส แฮช ในรูปแบบเลขฐานสิบหก

ตาม เอกสาร Kotlin (2026) toString ของ data class มีรูปแบบ: “User(id=1, name=John, email=john@example.com)” เมื่อลบคุณสมบัติออกจากคอนสตรักเตอร์หลัก toString จะถูกอัปเดตโดยอัตโนมัติ — ความเสี่ยงของการไม่ซิงค์กันจะถูกกำจัด

ฟังก์ชัน copy และการแยกโครงสร้าง

copy เป็นหนึ่งในคุณสมบัติสำคัญของ data class มันสร้างสำเนาแบบตื้นของวัตถุพร้อมความสามารถในการเปลี่ยนค่าของคุณสมบัติที่ระบุ

kotlin
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) แทนที่จะเปลี่ยนแปลงวัตถุที่มีอยู่ จะสร้างสำเนาใหม่พร้อมฟิลด์ที่ปรับเปลี่ยน ทำให้โค้ดคาดเดาได้ง่ายขึ้นและปลอดภัยในสถานการณ์ หลายเธรด

การแยกโครงสร้างผ่าน componentN

data class จะสร้างฟังก์ชัน component1, component2 และอื่นๆ โดยอัตโนมัติสำหรับแต่ละคุณสมบัติตามลำดับการประกาศ ซึ่งช่วยให้สามารถแยกโครงสร้างวัตถุเป็นตัวแปรได้

kotlin
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 อื่นได้หรือไม่?

ไม่ data class ไม่สามารถสืบทอด data class อื่นได้ อย่างไรก็ตาม มันสามารถสืบทอดคลาสทั่วไปหรือ implement อินเทอร์เฟซได้

คอนสตรักเตอร์หลักต้องมีกี่คุณสมบัติ?

อย่างน้อยหนึ่งคุณสมบัติ จำนวนสูงสุดไม่จำกัด แต่ componentN ถูกสร้างขึ้นสำหรับการแยกโครงสร้าง

คุณสมบัติจากเนื้อหาคลาสมีผลกับ equals หรือไม่?

ไม่ เมธอดอัตโนมัติจะพิจารณาเฉพาะคุณสมบัติจากคอนสตรักเตอร์หลักเท่านั้น คุณสมบัติจากเนื้อหาคลาสไม่มีส่วนร่วมใน equals, hashCode, toString และ copy

ฉันสามารถแทนที่เมธอดอัตโนมัติด้วยตนเองได้หรือไม่?

ใช่ คุณสามารถแทนที่ equals, hashCode หรือ toString ในเนื้อหาของ data class ได้ ในกรณีนี้ คอมไพเลอร์จะไม่สร้างการใช้งานของตัวเอง

data class แตกต่างจากคลาสทั่วไปอย่างไร?

data class จะสร้าง equals, hashCode, toString, copy และ componentN โดยอัตโนมัติ คลาสทั่วไปไม่มีเมธอดเหล่านี้หากไม่มีการ implement ด้วยตนเอง

สรุป

  • data class — โครงสร้างไวยากรณ์ Kotlin สำหรับเก็บข้อมูลพร้อมเมธอดที่สร้างโดยอัตโนมัติ
  • equals และ hashCode — การเปรียบเทียบเชิงโครงสร้างตามคุณสมบัติของคอนสตรักเตอร์หลัก
  • toString — การแสดงวัตถุที่อ่านได้สำหรับการดีบักและการบันทึก
  • copy — การคัดลอกแบบตื้นพร้อมการแทนที่ฟิลด์แต่ละรายการด้วยอาร์กิวเมนต์ที่มีชื่อ
  • componentN — การแยกโครงสร้างวัตถุเป็นตัวแปรเพื่อการทำงานกับคอลเล็กชันที่สะดวก
  • ข้อจำกัด — final โดยค่าเริ่มต้น อย่างน้อยหนึ่งคุณสมบัติ ไม่มีการสืบทอด data->data
  • การใช้งาน — DTO, โมเดล API, value objects, state ใน MVVM

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม