当前位置: 首页 > article >正文

【编程语言】Kotlin快速入门 - 伴生对象与懒加载

静态与顶层方法

静态方法(伴生对象)

Java中有静态方法的概念,但是在Kotlin中这个静态方法被弱化了,还记得我们使用object创建一个单例类吗,创建的单例类我们当时可以使用像静态方法一样的调用方式取调用,但object修饰的类会把它的所有方法都变成类似静态方法一样的调用,于是Kotlin提供了companion object修饰符,用于在类中修饰静态方法,那样一个类就可以同时存在静态和非静态方法了。

class Student(name: String, age: Int, val clazz: String): Person(name, age), Study {
    override fun doHomeWork() {
        println("do homework.")
    }
    
    companion object {
        fun sayHello() {
            println("Hello!")
        }
    }
}

但是这种方式产生的类似静态方法一样的调用并非真正的静态方法,如果你在Java中使用类似静态方法的调用会发现根本找不到这个方法,companion object只是语法上模拟静态方法的调用方式,实际上它们都不是真正的静态方法,因此你如果需要在Java中调用,那么你需要在方法上加上@JvmStatic注解

class Student(name: String, age: Int, val clazz: String): Person(name, age), Study {
    override fun doHomeWork() {
        println("do homework.")
    }

    companion object {
        @JvmStatic
        fun sayHello() {
            println("Hello!")
        }
    }
}
顶层方法

在kotlin中,顶层方法指的是不用类似静态方法那样的调用方式调用的方法,比如Helper.kt文件中有一个sayHello方法,那么sayHello就是一个顶层方法,你可以在其他类中通过sayHello()直接调用,而不用通过Helper.sayHello()调用。

顶层方法的定义就是单纯一个kt文件,在里面定义的所有fun方法都将做为顶层方法,例如:

package dev.xuanran.kt2

// Helper.kt
fun sayHello() {
    println("Hello!")
}
package dev.xuanran.kt2

// Main.kt
fun main() {
    sayHello()
}

由于Java中没有顶层方法的概念,所以在Java中如果需要调用顶层方法的话,那么就需要通过Helper.sayHello()的形式调用。

延迟初始化

在正常的开发中,类里面肯定存在很多全局变量,而很多全局变量可能只有在类初始化的时候才能去创建实例,但由于Kotlin的变量不可为空的机制,你只能给类似的变量类型后面加上?来先手动给它赋值为null(这里的Demo假设student的对象实例需要通过网络获取)。

var student : Student? = null

fun main() {
    // network...
}

但是这样会产生一个缺点就是后续你再去调用student内部的方法时,因为你允许这个变量可空,所以每次调用都需要来检查是否为空。

为此,Kotlin提供了延迟初始化功能,使用lateinit修饰全局变量,那么就可以避免可空修饰?以及后续每次使用前用if判空。

lateinit var student: Student

fun main() {
    // network...
    student.doReadBook()
}

但是lateinit关键字也不是没有风险,如果你在它之前就调用它,那么还是会产生Exception的。

紧接着Kotlin也给我们提供了一种方式,帮助我们判断某个全局变量是否已初始化:::变量名.isInitialized,如果已经初始化过了,我们就可以不用再执行初始化操作了。

lateinit var student: Student

fun main() {
    if (!::student.isInitialized) {
        // network...
    }
    student.doReadBook()
}

lazy懒加载

lazy代码块是Kotlin提供的一种懒加载技术,代码块中的代码一开始并不会执行,只有当修饰的变量首次被调用的时候才会执行,并且将最后一行代码的返回值赋值给被修饰的全局变量,具体语法规则如下:

val p by lazy {
    println("b")
    "c"
}

fun main() {
    println("a")
    println(p)
}

输出结果:a b c


http://www.kler.cn/news/362056.html

相关文章:

  • 数字后端实现静态时序分析STA Timing Signoff之min period violation
  • 数学学习——积化和差、和差化积
  • 优化多表联表查询的常见方法归纳
  • FineReport 数据筛选过滤
  • 【系统规划与管理师】历年各章节分值汇总(论文)
  • [项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 | scp
  • 关于mysql jdbc驱动fetchSize属性的说明
  • 华山论剑之Rust的Trait
  • 【Linux】一个简单while循环实现【严格轮转】,从而理解什么是【多线程的忙等待】
  • 挑战性课程《信号处理系统》(原信号与系统+数字信号处理)课程课程设计
  • Mamba学习笔记(4)——Mamba核心
  • 代码工艺:写代码的好习惯
  • 使用python自制桌面宠物,好玩!——枫原万叶桌宠,可以直接打包成exe去跟朋友炫耀。。。
  • 【LeetCode】123.买卖股票的最佳时间
  • 使用 NLP 和模式匹配检测、评估和编辑日志中的个人身份信息 - 第 1 部分
  • VBA技术资料MF212:确定Excel文件是否正在使用中
  • SSM与Springboot是什么关系? -----区别与联系
  • Psychophysiology:脑-心交互如何影响个体的情绪体验?
  • java的继承
  • git提交信息写错处理方式
  • Lua脚本的原子性
  • element plus e-table表格中使用多选,当翻页时已选中的数据丢失
  • dd小程序如何监听props中对象的值
  • PHP中‘BITWISE AND‘运算符和‘LOGICAL AND‘运算符的区别
  • 集成Twilio发送短信
  • 【AIGC半月报】AIGC大模型启元:2024.10(下)