lazy در کاتلین
سه شنبه, ۱۱ مهر ۱۴۰۲، ۰۸:۳۴ ب.ظ
وقتی یه کلاسی لود میشه تمامی فیلدهای اون هم لود میشن. بعضی از آبجکت ها سنگین هستن (مثل دیتابیس اینا) و initial شدن اونها کاست زیادی داره. به همین خاطر از lazy توی کاتلین استفاده میشه و باعث میشه به محض استفاده از اون آبجکت، لود بشه.
مثال:
کلاس Person به صورت زیر تعریف شده:
data class Person(private val name : String, private val lastName : String){
private val TAG = "Person"
init {
Log.d(TAG, "person: $this")
}
override fun toString(): String {
return "name: ${this.name}, lastName: ${this.lastName}"
}
}
اکتیویتی main:
class MainActivity : AppCompatActivity() {
private val TAG = "MainActivity"
val person1 by lazy {
Person("Maryam", "jooon")
}
val person2 = Person("Omid", "jooon")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d(TAG, "person1: ${person1}")
}
}
خروجی:
همون طور که مشخص هست، با اینکه person2 هنوز استفاده نشده ولی init شده. در حالی که person1 به محض اینکه ازش توی log استفاده شده، init شده.
نحوه استفاده اینجوری هست که بعد از اسم متغیر از {}by lazy استفاده میشه و توی لامبدا مقدار آبجکت مد نظرمون رو مینویسیم (هایلایت شده).
۰۲/۰۷/۱۱