Sobes.tech
Middle

Кай вақт бояд дар Kotlin 'lateinit' ва 'by lazy' истифода баред?

sobes.tech AI

Ҷавоб аз AI

lateinit истифода мешавад барои хусусиятҳои non-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)
        // Акнун метавон истифода бурд
    }
}

by lazy барои хусусиятҳои non-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, вақте ки арзиши хусусият аз контекст ё дигар омилҳо вобаста аст ва бояд пас аз сохтани объект, аммо пеш аз истифодаи он таъин карда шавад (масалан, дар пайваст кардани View дар Android Activity).

Истифода баред by lazy барои хусусиятҳое, ки гарон ҳастанд дар сохтмон ё метавонанд дар тӯли тамоми умри объект заруранд, ё вақте ки мехоҳед инициализатсияро то истифодаи аввал таъхир кунед.