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

การคัดลอกด้วย copy() และการเขียนทับบางส่วน

ใช้ copy() เพื่อสร้างอินสแตนซ์ที่แก้ไขแล้วโดยไม่เปลี่ยนแปลงต้นฉบับ

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

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

copy() สร้างอินสแตนซ์ใหม่ของคลาสข้อมูลโดยแก้ไขพร็อพเพอร์ตีบางรายการ พร็อพเพอร์ตีที่ไม่ได้ระบุจะคงค่าเดิมไว้ทั้งหมด

copy() พื้นฐาน

ส่งอาร์กิวเมนต์ที่ระบุชื่อเพื่อแทนที่พร็อพเพอร์ตีที่ต้องการ
data class Person(val name: String, val age: Int, val city: String)
val alice = Person("Alice", 30, "Berlin")
val olderAlice = alice.copy(age = 31)
println(olderAlice)  // Person(name=Alice, age=31, city=Berlin)

การคัดลอกหลายฟิลด์

แทนที่ฟิลด์ได้มากเท่าที่จำเป็น
data class Config(val host: String, val port: Int, val ssl: Boolean, val timeout: Int)
val prod = Config("prod.server", 443, true, 30)
val test = prod.copy(host = "test.server", port = 8080, ssl = false)
println(test)

copy ไม่แก้ไขต้นฉบับ

copy จะสร้างออบเจ็กต์ใหม่เสมอ ออบเจ็กต์ต้นฉบับจะไม่เปลี่ยนแปลงเลย
data class Point(val x: Int, val y: Int)
val origin = Point(0, 0)
val moved = origin.copy(x = 5)
println(origin)  // Point(x=0, y=0) — unchanged
println(moved)   // Point(x=5, y=0)

ข้อควรระวังเกี่ยวกับการคัดลอกแบบลึก

copy เป็นการคัดลอกแบบตื้น ออบเจ็กต์ที่แก้ไขได้ภายในคลาสข้อมูลจะถูกใช้ร่วมกันระหว่างต้นฉบับกับสำเนา
data class Team(val name: String, val members: MutableList<String>)
val t1 = Team("A", mutableListOf("Alice"))
val t2 = t1.copy(name = "B")
t2.members.add("Bob")       // modifies SHARED list!
println(t1.members)  // [Alice, Bob] ← also changed!

การหลีกเลี่ยงปัญหาจากการคัดลอกแบบตื้น

ใช้อิมมิวเทเบิลดาต้าภายในคลาสข้อมูลเพื่อหลีกเลี่ยงปัญหาจากการใช้ค่าร่วมกัน
data class Team(val name: String, val members: List<String>)  // immutable list
val t1 = Team("A", listOf("Alice"))
val t2 = t1.copy(name = "B", members = t1.members + "Bob")
println(t1.members)  // [Alice]
println(t2.members)  // [Alice, Bob]

copy ในการจัดการสถานะ

copy เป็นแนวทางมาตรฐานสำหรับอัปเดตสถานะในสถาปัตยกรรมแบบ Redux หรือ MVI
data class UiState(val loading: Boolean, val items: List<String>, val error: String?)
fun reduce(state: UiState, action: Action) = when (action) {
    is Loading -> state.copy(loading = true)
    is Success -> state.copy(loading = false, items = action.data)
    is Error -> state.copy(loading = false, error = action.msg)
}

copy กับพารามิเตอร์ค่าเริ่มต้น

คลาสข้อมูลที่มีพร็อพเพอร์ตีจำนวนมากยังคงใช้ copy ได้สะดวกด้วยพารามิเตอร์ที่ระบุชื่อ
data class Article(
    val id: Long, val title: String, val body: String,
    val published: Boolean = false, val views: Int = 0
)
val draft = Article(1L, "Hello", "Content...")
val published = draft.copy(published = true)
println(published.title)  // Hello

การใช้ copy ในการทดสอบ

copy ทำให้เตรียมชุดข้อมูลทดสอบได้ง่าย เพียงสร้างออบเจ็กต์พื้นฐานหนึ่งตัวแล้วเปลี่ยนเฉพาะฟิลด์ที่ต้องการ
val baseUser = User(id = 1, name = "Test", email = "test@test.com", active = true)
val inactiveUser = baseUser.copy(active = false)
val renamed = baseUser.copy(name = "Renamed")

copy เทียบกับรูปแบบตัวสร้าง

copy() ของคลาสข้อมูลคือแนวทางของ Kotlin ที่ใช้แทนรูปแบบตัวสร้าง สำหรับออบเจ็กต์ซับซ้อนที่มีฟิลด์เสริมจำนวนมาก การใช้คลาสข้อมูลร่วมกับ copy จะกระชับกว่า
// Java Builder:
User.builder().name("A").age(30).role("admin").build()
// Kotlin:
val u = User("A", 30, "admin")  // or copy from base

ความหมายแบบเรคคอร์ด

คลาสข้อมูลที่มีพร็อพเพอร์ตี val จะทำงานคล้ายเรคคอร์ดของ Java (JDK 16 ขึ้นไป) คือไม่เปลี่ยนแปลง อิงตามค่า และแสดงผลได้โดยอัตโนมัติ
data class RGB(val r: Int, val g: Int, val b: Int)
val white = RGB(255, 255, 255)
println(white)  // RGB(r=255, g=255, b=255)

ตรวจสอบอย่างรวดเร็ว

เมื่อเรียกใช้ copy() กับอินสแตนซ์คลาสข้อมูลต้นฉบับ จะเกิดอะไรขึ้น

สรุปทบทวน

copy() สร้างอินสแตนซ์ใหม่พร้อมฟิลด์ที่ถูกแทนที่ โดยต้นฉบับจะไม่เปลี่ยนแปลง เหมาะสำหรับการจัดการสถานะ การทดสอบ และการสร้างออบเจ็กต์ในรูปแบบตัวสร้าง โปรดระวังการคัดลอกแบบตื้นเมื่อมีพร็อพเพอร์ตีที่แก้ไขได้ ต่อไป: การแยกโครงสร้าง

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

บทเรียน “การคัดลอกด้วย copy() และการเขียนทับบางส่วน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การคัดลอกด้วย copy() และการเขียนทับบางส่วน”

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

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

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

บทเรียน “การคัดลอกด้วย copy() และการเขียนทับบางส่วน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. พื้นฐาน Data Class: เมธอดที่สร้างอัตโนมัติ
  2. การคัดลอกด้วย copy() และการเขียนทับบางส่วน
  3. การประกาศแบบแยกโครงสร้างด้วย componentN
  4. Data Class ในคอลเลกชันและในฐานะคีย์ของ Map
← กลับไปที่ Kotlin Academy