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()
}
}