Ленивая инициализация Kotlin
public class JavaClass {
private Student student;
private void test() {
student.readBooks();
}
}
В кодировании Java приведенный выше оператор является относительно распространенным.Если он не инициализирован при объявлении, объект по умолчанию имеет значение null
, и даже если объект не инициализирован, методы и переменные объекта могут вызываться обычным образом в других местах ( это всего лишь демонстрация, при обычном вызове Empty сначала!).
Но в kotlin, если мы не инициализируем переменную при ее объявлении, в месте вызова будет сообщено об ошибке с подсказкой: Переменная 's' должна быть инициализирована. код показывает, как показано ниже:
fun main() {
var s: Student
//这里s飘红报错Variable 's' must be initialized
s.readBooks()
s.doHomework()
}
Но много раз, когда мы привыкли его использовать, мы деинициализируем, поэтому мы можем сначала присвоить объекту null и изменить код следующим образом:
fun main() {
var s:Student? = null;
s = Student("lucy", 23)
s?.readBooks()
s?.doHomework()
}
Как видно из кода, из-за проверки нулевого указателя в Kotlin его нужно добавлять в момент объявления ?
для прохождения компиляции, а ?
добавлять переменные и методы для последующего доступа к этому объекту очень неудобно. lateinit
Чтобы решить вышеупомянутую проблему вызова, вы можете использовать определение ключевого слова в kotlin .
латиноамериканец
lateinit var s: Student;
fun main() {
if(!::s.isInitialized){
s = Student("lucy", 23)
}
s.readBooks()
s.doHomework()
}
После использования ключевых слов lateinit
для изменения объект не может быть инициализирован первым.
isInitialized
Вы можете использовать этот метод, чтобы определить , когда требуется инициализация .Добавление двух двоеточий впереди ::
является фиксированным способом записи.При записи сначала пишите двойные двоеточия, иначе isInitialized
метод не будет автоматически запрашивать позже.
Обратите внимание lateinit
, что не забудьте инициализировать при использовании, иначе UninitializedPropertyAccessException
при запуске будет выдано исключение.
Ленивые
Использование отложенной инициализации может временно не инициализировать переменную до тех пор, пока она не будет использована в первый раз, что также называется отложенной инициализацией.
fun main() {
val r = Request()
r.config
}
class Request() {
val config by lazy {
loadConfig()
}
private fun loadConfig(): String {
println("loadConfig")
return "already load"
}
}
Вышеупомянутое config
присвоение будет назначено только в том месте, где на него впервые ссылаются, и не будет назначено при создании объекта.Этот тип инициализации подходит для некоторых логических переменных, которые редко используются.