Ключевое слово lateinit

Ключевое слово lateinit используется для объявления свойств класса, которые не инициализируются сразу в конструкторе, но гарантированно будут инициализированы перед первым использованием. Применяется только для var свойств не nullable типов, которые не являются примитивами.

Синтаксис

kotlinlateinit var propertyName: Type

Пример

Объявление отложенно инициализируемого свойства:

kotlinclass UserService {
  lateinit var userRepository: UserRepository
  
  fun initialize() {
    userRepository = UserRepository()
  }
  
  fun getUser(id: Int): User {
    return userRepository.findUser(id)
  }
}

Пример

Проверка инициализации свойства с помощью ::property.isInitialized:

kotlinclass ConfigLoader {
  lateinit var config: Configuration
  
  fun loadConfig() {
    config = Configuration.loadFromFile()
  }
  
  fun printConfig() {
    if (::config.isInitialized) {
      println(config)
    } else {
      println("Config not loaded yet")
    }
  }
}

Пример

Ошибка при обращении к неинициализированному lateinit свойству:

kotlinclass DataProcessor {
  lateinit var dataSource: DataSource
  
  fun process() {
    // Вызовет UninitializedPropertyAccessException
    val data = dataSource.getData()
  }
}

Результат выполнения кода:

kotlinUninitializedPropertyAccessException: lateinit property dataSource has not been initialized

Пример

Использование lateinit для внедрения зависимостей:

kotlinclass OrderService {
  lateinit var paymentGateway: PaymentGateway
  lateinit var emailService: EmailService
  
  fun processOrder(order: Order) {
    paymentGateway.processPayment(order)
    emailService.sendConfirmation(order)
  }
}

Ограничения

Ключевое слово lateinit имеет следующие ограничения:

Смотрите также

  • ключевое слово lazy,
    для ленивой инициализации свойств
  • ключевое слово var,
    для объявления изменяемых свойств
  • ключевое слово val,
    для объявления неизменяемых свойств