YB1375头像
关注

Kotlin 引用操作符::

在 Kotlin 中,:: 被称为引用操作符(Reference Operator)。它的核心作用是:“获取一个实体的引用,而不是立即执行它。”
:: 主要还有以下三个核心用途:

  1. 属性引用 (Property References)
    就像函数引用一样,你可以获取一个类中属性(变量)的引用。
    • 写法:对象::属性名
    • 用途:主要用于反射(Reflection)或者某些需要动态获取属性值的 API 中(例如某些序列化库或动态 UI 框架)。
    例子:
data class User(val name: String)

fun main() {
    val user = User("Alice")
    
    // 获取 name 属性的引用
    val property = User::name
    
    // 在反射中你可以通过这个引用来获取值
    println(property.get(user)) // 输出: Alice
}
  1. 类引用 / 类型引用 (Class References)
    这是 Kotlin 反射系统的基础。它用于获取一个类的 KClass 对象,从而在运行时获取该类的构造函数、方法、属性等信息。
    • 写法:类名::class
    • 用途:这是 Android 开发中非常常见的操作,例如在依赖注入(Hilt/Koin)、反射创建实例、或者处理泛型时。
    例子:
class MyActivity

fun main() {
    // 获取 MyActivity 的类引用 (KClass)
    val kClass = MyActivity::class
    
    println(kClass.simpleName) // 输出: MyActivity
    println(kClass.java.isAccessible) // 获取底层的 Java Class
}

注:在 Kotlin 中,获取类引用必须用 ::class。这与 Java 的 MyActivity.class 不同。

  1. 构造函数引用 (Constructor References)
    你可以通过 :: 获取类构造函数的引用。虽然在 Kotlin 中不如 Java 常用,但在某些高级反射场景下很有用。
    例子:
class Person(val name: String)

fun main() {
    // 获取 Person 类的构造函数引用
    val constructor = Person::class.primaryConstructor
    
    // 使用构造函数创建一个新实例
    val person = constructor?.call("Bob")
    println(person)
}

对比:

符号动作结果例子
.(成员访问操作符)执行(Execution)立即运行代码,或取出当前属性值appState.navigateBack()
::(可调用引用操作符)标记(Reference)取得该函数/属性/类的“地址”,得到一个可传递的对象appState::navigateBack

1.延迟执行:有些时候你现在不想执行这个动作,你只是想把这个“动作”告诉另一个组件(比如按钮的 onClick),等用户真的点击了,再由那个组件去执行它。
2.反射与动态性:如果你不知道程序运行到哪一步时需要调用哪个方法,或者你想动态地遍历一个类里所有的属性,你就必须用 :: 来获取这些信息。
3.符合函数式编程:在许多高级编程范式中,把“函数”当做“数据”来传递是非常常见的做法。:: 就是把函数变成数据的桥梁。

{ appState.navigateBack() } 与 appState::navigateBack
在 Kotlin 中,这两者代表了不同的函数表达方式:一个是匿名函数(Lambda 表达式),一个是函数引用(Function Reference)。

  1. { appState.navigateBack() } —— 匿名函数 (Lambda Expression)
    这是最常用的方式。你定义了一个新的函数块,并在执行这个块时去调用 appState.navigateBack()。
    • 本质:这是一个新的函数对象。每当这个 Lambda 被创建时(在某些情况下),它实际上是创建了一个闭包。
    • 灵活性:极高。你可以在调用函数之前或之后添加任何逻辑。
    ◦ 例子:onBackPress = { println(“Going back…”); appState.navigateBack() }
    ◦ 例子:onBackPress = { appState.navigateBack(someExtraId) }(可以传递额外参数)。
    • 捕获(Closure):它会“捕获”当前作用域中的变量(如 appState)。
  2. appState::navigateBack —— 函数引用 (Function Reference)
    这是 Kotlin 提供的一种语法糖,它直接指向 appState 对象上的 navigateBack 方法。
    • 本质:它不是创建一个新的函数对象,而是引用一个已经存在的函数。
    • 灵活性:较低。它只能直接调用该方法。如果你需要传递额外参数或者在调用前后加逻辑,就不能直接用这种写法。
    • 性能:略高。因为它不需要创建新的 Lambda 对象,直接引用内存中已有的方法。
    • 约束:目标函数的参数列表必须与接收端的函数类型完全匹配。如果 navigateBack 需要参数而你提供的是 () -> Unit,这种写法就会报错。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/u010505364/article/details/166904060

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--