0Pricing
Kotlin Academy · درس

النسخ باستخدام copy() والتجاوز الجزئي

استخدم copy() لإنشاء مثيلات معدّلة من دون تغيير المثيل الأصلي.

النسخ باستخدام copy() والتجاوز الجزئي درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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-style أو 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 في مقابل نمط Builder

تُعد data class copy() إجابة Kotlin عن نمط Builder. وبالنسبة إلى الكائنات المعقدة ذات الحقول الاختيارية الكثيرة، تكون data class مع 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() مثيلًا جديدًا مع تجاوز الحقول — ولا يتغير الكائن الأصلي. وهي مفيدة لإدارة الحالة والاختبارات والإنشاء بأسلوب Builder. انتبه إلى النسخ السطحي عند استخدام خصائص قابلة للتغيير. التالي: التفكيك!

الأسئلة الشائعة

هل درس «النسخ باستخدام copy() والتجاوز الجزئي» مجاني؟

نعم — نص درس «النسخ باستخدام copy() والتجاوز الجزئي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «النسخ باستخدام copy() والتجاوز الجزئي»؟

استخدم copy() لإنشاء مثيلات معدّلة من دون تغيير المثيل الأصلي. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «النسخ باستخدام copy() والتجاوز الجزئي»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات Data Class: الدوال المُنشأة تلقائيًا
  2. النسخ باستخدام copy() والتجاوز الجزئي
  3. تصريحات التفكيك باستخدام componentN
  4. Data Classes في المجموعات ومفاتيح Map
← العودة إلى Kotlin Academy