data class

أولاً: مفهوم data class :-

ماذا لو كان لديك . class واردت طباعة القيم التي داخله او طباعته كـObject فانت عند القيام بامر الطباعة سيقوم المترجم بطباعة hashcode للـObject وليس للبيانات ! حتى لو اردت المقارنة بين اكثر من Object فسيقوم المترجم بالمقارنة بين hashcode وليس بين القيم للـObject . ايضاً اذا اردت نسخ بيانات Object الى Object جديد فانت لست قادر على ذلك مع class بصيغته العامة .
لذلك كان لابد من ايجاد طريقة جديدة او مفهوم جديد وهو استخدام data class والذي سيقوم بجميع المهام من مقارنة ونسخ وطباعة بشكل سريع ودون كتابة الكثير من الدوال والشفرات البرمجية


ثانياً : طريقة data class :-

data class employee(var id:Int , var name:String , var department:String){

    

}

ثالثاً : مثال لاستخدام class :-

لاحظ في هذه الشفرة انشئنا class وقمنا بارسال له الاسم والقيمة ونريد عمل مقارنات وطباعة للقيم في class ولكن يتضح لنا هنا انه لايقوم بالطباعة والمقارنة مثل ماكان متوقع فهو يقوم بالمقارنة hashcode او يقوم بطباعته .

class Employee(name: String, salary: Int) {
    fun display() {
        print("Hello Employee")
    }
}

fun main(args: Array<String>) {
    val emp1 = Employee("Ahmed", 11200)
    val emp2 = Employee("Ahmed", 11200)
    //compare
    print(emp1 == emp2)  //false
    //copy
    val emp3 = emp1.copy() // unresolved reference
    //print
    print(emp1) // hashcode 'Employee@27c170f0'
}

رابعاً : اضافة data قبل تعريف  class :-

الان بعد ان اتضح لك ان بعض العمليات لايمكن للـclass القيام بها ويجب عليك كتابتها وتعريفها للطباعة والنسخ . ولكن مع kotlin كل مافي الامر انك تحتاج الى اضافة data قبل اسم class وستكون قادر على القيام بجميع العمليات من نسخ وطباعة ومقارنة كما ستلاحظ في الشفرة القادمة .

data class Employee(val name: String, val salary: Int) {
    fun display() {
        print("Hello Employee")
    }
}

fun main(args: Array<String>) {
    val emp1 = Employee("Ahmed", 11200)
    val emp2 = Employee("Ahmed", 11200)
    //compare
    print(emp1 == emp2)  //true
    //copy
    val emp3 = emp1.copy(salary = 2000) // Employee(name=Ahmed, salary=2000)
    //compare
    print(emp1 == emp3)  //false
    //print
    println(emp1) // Employee(name=Ahmed, salary=11200)
    println(emp3) // Employee(name=Ahmed, salary=2000)
}

 

تلاحظ في الشفرة البرمجية اني قمت بنسخ emp1 مع تعديل قيمة salary مباشرة ونسخ اسم الموظف دون تعديل