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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ