Sobes.tech
Middle

Երբ պետք է օգտագործել 'lateinit' և 'by lazy' Kotlin-ում?

sobes.tech AI

Պատասխան AI-ից

lateinit օգտագործվում է ոչ-nullable հատկությունների համար, որոնք կստեղծվեն ավելի ուշ, առաջին անգամ դրանց հասանելիությունից առաջ։ Կիրառվում է var-ի հետ։

class UserActivity : AppCompatActivity() {
    lateinit var binding: ActivityUserBinding // Կստեղծվի onCreate-ում

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // Այժմ կարող եք օգտագործել binding-ը
    }
}

by lazy օգտագործվում է ոչ-nullable կամ nullable հատկությունների համար, որոնք ստեղծվում են առաջին հասանելիության ժամանակ։ Կիրառվում է val-ի հետ։

class DataManager {
    val apiService: ApiService by lazy {
        Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

Համեմատություն:

Գծանշում lateinit by lazy
Կիրառում var val
Գծանշի տեսակ Non-nullable Non-nullable կամ nullable
Ինիցիալիզացիա Ուշ, ձեռքով Առաջին հասանելիության ժամանակ, ավտոմատ կերպով
Տարածքային անվտանգություն Անհրաժեշտ չէ ստանդարտորեն (եթե ձեռքով չի սինխրոնիզացվում) Ստանդարտորեն ապահովված (սինխրոնիզացված)
Զրոյական արժեք Չի թույլատրվում մինչև ինիցիալիզացիա (գցում է արտահայտություն) Չի, տիպը որոշվում է ինիցիալիզատորով

Օգտագործեք lateinit, երբ հատկության արժեքը կախված է կոնտեքստից կամ այլ գործոններից և պետք է սահմանվի ստեղծելուց հետո, բայց օգտագործելուց առաջ (օրինակ, Android Activity-ում View-ների կապակցման ժամանակ):

Օգտագործեք by lazy հատկությունների համար, որոնք ծախսատար են ստեղծման ժամանակ կամ կարող են չպահանջվել ողջ օբյեկտի կյանքի ընթացքում, կամ երբ անհրաժեշտ է հետաձգել ինիցիալիզացիան մինչև առաջին իրական օգտագործումը։