Kotlin Learning — ленивая загрузка Lateinit и от ленивых

Ленивая инициализация 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присвоение будет назначено только в том месте, где на него впервые ссылаются, и не будет назначено при создании объекта.Этот тип инициализации подходит для некоторых логических переменных, которые редко используются.

Guess you like

Origin blog.csdn.net/kongqwesd12/article/details/131435427