0Pricing
Kotlin Academy · บทเรียน

copy และ equals

ฟังก์ชันที่สร้างขึ้นโดยอัตโนมัติ

copy และ equals เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

ฟังก์ชันที่สร้างขึ้น

นอกเหนือจาก toString แล้ว คลาสข้อมูลยังสร้างการเท่ากัน, hashCode และ copy ด้วย

ทั้งสามสิ่งนี้ทำให้คลาสข้อมูลเหมาะอย่างยิ่งสำหรับการเปรียบเทียบและสร้างสำเนา

ความเท่ากันเชิงโครงสร้าง

equals ที่สร้างขึ้นจะเปรียบเทียบวัตถุจากค่าของคุณสมบัติ ไม่ใช่จากเอกลักษณ์ของวัตถุ

อินสแตนซ์ของคลาสข้อมูลสองรายการที่มีค่าเหมือนกันจะเท่ากันเมื่อใช้ ==

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = User("Alice", 30)
    println(a == b)
}

ค่าที่ต่างกันย่อมไม่เท่ากัน

เมื่อเปลี่ยนคุณสมบัติใด ๆ วัตถุทั้งสองจะไม่เท่ากันอีกต่อไป

ความเท่ากันคำนวณจากคุณสมบัติทุกตัวในตัวสร้างหลัก

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = User("Alice", 31)
    println(a == b)
}

ความเท่ากันกับเอกลักษณ์

ใช้ == สำหรับความเท่ากันของค่า (เชิงโครงสร้าง) และใช้ === สำหรับความเท่ากันของการอ้างอิง (เอกลักษณ์)

วัตถุข้อมูลสองรายการที่เท่ากันอาจเป็นอินสแตนซ์คนละรายการในหน่วยความจำ

data class User(val name: String)

fun main() {
    val a = User("Alice")
    val b = User("Alice")
    println(a == b)  // values match
    println(a === b) // different instances
}

hashCode ที่สอดคล้องกัน

hashCode จะถูกสร้างให้สอดคล้องกับ equals: วัตถุที่เท่ากันจะให้ค่าแฮชเดียวกัน

นี่คือสิ่งที่ทำให้คลาสข้อมูลทำงานได้อย่างถูกต้องในชุดข้อมูลและในฐานะคีย์ของโครงสร้างแมป

data class Point(val x: Int, val y: Int)

fun main() {
    val a = Point(1, 2)
    val b = Point(1, 2)
    println(a.hashCode() == b.hashCode())
}

ฟังก์ชัน copy

copy จะสร้างวัตถุใหม่ที่เหมือนกับวัตถุต้นฉบับ

เมื่อใช้คุณสมบัติ val ที่ไม่เปลี่ยนแปลง การคัดลอกคือวิธีสร้างรุ่นที่แก้ไขแล้ว

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = a.copy()
    println(b)
    println(a == b)
}

คัดลอกพร้อมการเปลี่ยนแปลง

ส่งอาร์กิวเมนต์แบบมีชื่อให้ copy เพื่อเปลี่ยนคุณสมบัติเฉพาะรายการ โดยคงคุณสมบัติที่เหลือไว้

นี่คือรูปแบบมาตรฐานสำหรับการปรับปรุงข้อมูลที่ไม่เปลี่ยนแปลง

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val older = a.copy(age = 31)
    println(a)
    println(older)
}

การคัดลอกไม่เปลี่ยนแปลงต้นฉบับ

copy จะไม่เปลี่ยนแปลงวัตถุต้นทาง ต้นฉบับยังคงมีค่าเดิม

ความไม่เปลี่ยนแปลงนี้ทำให้การเปลี่ยนแปลงสถานะคาดเดาได้และปลอดภัย

data class Account(val owner: String, val balance: Int)

fun main() {
    val original = Account("Sam", 100)
    val updated = original.copy(balance = 150)
    println(original.balance)
    println(updated.balance)
}

การต่อการคัดลอก

เนื่องจาก copy คืนค่าวัตถุใหม่ คุณจึงสามารถปรับปรุงหลายรายการต่อเนื่องกันได้

แต่ละขั้นตอนจะสร้างค่าที่สดใหม่และเป็นอิสระจากกัน

data class Config(val volume: Int, val muted: Boolean)

fun main() {
    val base = Config(50, false)
    val result = base.copy(volume = 70).copy(muted = true)
    println(result)
}

นับเฉพาะคุณสมบัติของตัวสร้าง

เช่นเดียวกับการเปรียบเทียบความเท่ากัน copy จะจัดการเฉพาะคุณสมบัติของตัวสร้างหลักเท่านั้น

คุณสมบัติในส่วนเนื้อความจะถูกตั้งกลับเป็นค่าเริ่มต้นในสำเนา ดังนั้นควรเก็บสถานะสำคัญไว้ในตัวสร้าง

data class User(val name: String) {
    var note: String = "none"
}

fun main() {
    val a = User("Alice")
    a.note = "VIP"
    val b = a.copy()
    println(b.note) // back to default
}

สรุปรวม

ฟังก์ชันที่สร้างขึ้นทำให้คลาสข้อมูลมีความสามารถสูง:

  • equals และ == เปรียบเทียบจากค่า
  • hashCode ยังคงสอดคล้องกับการเท่ากัน
  • copy สร้างสำเนาพร้อมการเปลี่ยนแปลงที่เลือกได้
data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = a.copy(name = "Alicia")
    println(a == b)
    println(b)
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับ copy และ equals

ทบทวน

คุณได้เรียนรู้ฟังก์ชันที่สร้างขึ้นของคลาสข้อมูล:

  • การเท่ากันเปรียบเทียบจากค่า โดยใช้ == เทียบกับ ===
  • hashCode ยังคงสอดคล้องกันสำหรับชุดข้อมูล
  • copy สร้างสำเนาพร้อมการเปลี่ยนแปลงเฉพาะรายการ

ถัดไป คุณจะได้เรียนรู้ว่าการประกาศแบบแยกส่วนแยกวัตถุออกเป็นตัวแปรอย่างไร

คำถามที่พบบ่อย

บทเรียน “copy และ equals” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “copy และ equals” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “copy และ equals”

ฟังก์ชันที่สร้างขึ้นโดยอัตโนมัติ คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “copy และ equals” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การประกาศ Data Class
  2. copy และ equals
  3. การประกาศแบบแยกโครงสร้าง
  4. Data Class ในคอลเลกชัน
← กลับไปที่ Kotlin Academy