Sobes.tech
Middle

Ի՞նչ տարբերություն կա 'lateinit' բանալի բառի օգտագործման և 'by lazy {}' միջոցով դելեգացիայի միջև Kotlin-ում։

sobes.tech AI

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

lateinit-ը օգտագործվում է փոփոխական հատկությունների հետաձգված և սկզբնականացման համար (var), որոնք չեն կարող լինել nullable և որոնք ավելի ուշ կսկսվեն, օրինակ՝ ակտիվության կամ ֆրագմենտի կյանքի ցիկլի մեթոդում։ Կոմպիլյատորը չի երաշխավորում սկզբնականացումը, և անհայտ հատկության հասանելիությունը կհանգեցնի UninitializedPropertyAccessException արտահայտության:

by lazy {}-ը օգտագործվում է փոփոխական հատկությունների հետաձգված և սկզբնականացման համար (val)։ Սկզբնականացումը կատարվում է առաջին մուտքի ժամանակ, և արդյունքը պահվում է կեշում։ Սա տրոոոբեազոր է ըստ նախնական կարգավորումների և երաշխավորում է, որ ինիցիալիզատորը կկոչվի միայն մեկ անգամ։

Գծանշում lateinit by lazy {}
Կիրառվում է var val
Nullableություն Չի կարող լինել nullable Չի կարող լինել nullable
Ինիցիալիզացիայի երաշխիք Չի (միայն ծրագրավորողի կողմից) Այո (առաջին մուտքի ժամանակ)
Տրոոոբեազորություն Չի երաշխավորվում ըստ նախնական կարգավորումների Այո (նույնպես)
Գործառույթի տեսակ Փոփոխական Անփոփոխական

Նմուշ lateinit-ով:

class MyActivity : AppCompatActivity() {

    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView = findViewById(R.id.my_text_view)
        textView.text = "Hello, lateinit!"
    }
}

Նմուշ by lazy {}-ով:

class MyViewModel : ViewModel() {

    private val apiService: ApiService by lazy { provideApiService() } // Ինիցիալիզացիա առաջին օգտագործման ժամանակ

    private fun provideApiService(): ApiService {
        // ApiService ստեղծելու տրամաբանություն
        return ApiService()
    }

    fun fetchData() {
        // apiService ինիցիալիզացվում է այստեղ առաջին կանչի ժամանակ fetchData()
        apiService.getData()
    }
}