Ключевое слово lateinit
Ключевое слово lateinit используется для объявления
свойств класса, которые не инициализируются сразу в конструкторе,
но гарантированно будут инициализированы перед первым использованием.
Применяется только для var свойств не nullable типов,
которые не являются примитивами.
Синтаксис
lateinit var propertyName: Type
Пример
Объявление отложенно инициализируемого свойства:
class UserService {
lateinit var userRepository: UserRepository
fun initialize() {
userRepository = UserRepository()
}
fun getUser(id: Int): User {
return userRepository.findUser(id)
}
}
Пример
Проверка инициализации свойства с помощью ::property.isInitialized:
class ConfigLoader {
lateinit var config: Configuration
fun loadConfig() {
config = Configuration.loadFromFile()
}
fun printConfig() {
if (::config.isInitialized) {
println(config)
} else {
println("Config not loaded yet")
}
}
}
Пример
Ошибка при обращении к неинициализированному lateinit свойству:
class DataProcessor {
lateinit var dataSource: DataSource
fun process() {
// Вызовет UninitializedPropertyAccessException
val data = dataSource.getData()
}
}
Результат выполнения кода:
UninitializedPropertyAccessException: lateinit property dataSource has not been initialized
Пример
Использование lateinit для внедрения зависимостей:
class OrderService {
lateinit var paymentGateway: PaymentGateway
lateinit var emailService: EmailService
fun processOrder(order: Order) {
paymentGateway.processPayment(order)
emailService.sendConfirmation(order)
}
}
Ограничения
Ключевое слово lateinit имеет следующие ограничения:
- Может использоваться только с
varсвойствами - Не может использоваться с примитивными типами (
Int,Booleanи т.д.) - Не может использоваться с nullable типами (
String?) - Доступно только для свойств класса, но не для локальных переменных