编程Kotlin 移动开发者

Kotlin 中的扩展函数是什么,如何正确使用?描述应用中的潜在问题并给出代码示例。

用 Hintsage AI 助手通过面试

答:

扩展函数是允许在现有类中添加新功能的机制,无需继承或修改该类本身。

例如,对于 String 类,添加一个反转字符串的函数:

fun String.reverse(): String { return this.reversed() } println("abc".reverse()) // "cba"

扩展实际上并不修改类,而只是语法糖:它们被编译为静态方法,接受对象实例作为第一个参数。

优点: 简洁性、可读性、可扩展性。适合用于集合、字符串等的工具函数。

潜在问题:

  • 不能重写/替代类的方法;
  • 不能访问类的私有成员;
  • 名字冲突时实例方法优先于扩展;
  • 扩展属性仅与 getter/setter 一起工作,而非字段;

难题。

能否通过扩展函数向类添加一个新的变量(属性),用于存储状态?

答: 不能。扩展属性总是可计算的属性(getter/setter),而不是字段。它们不能存储状态——只能即时计算。

val String.secondChar: Char get() = this[1] // 仅计算,不存储!

由于不了解此主题的细微差别而导致的实际错误示例。


故事

在数据验证项目中,开发人员将扩展属性添加到模型类中,仿佛它会存储值,但后来发现该值始终被计算,而不是记住,这导致在多次调用时逻辑不正确。


故事

在一个大型应用程序中,扩展名称与类的方法相同,导致混淆:类的方法始终优先,扩展未被调用——花了一天时间调试“看不见”的代码。


故事

在某个库中,扩展用于类的私有字段,但后来发现它们根本无法访问私有属性,因此不得不重构模型的架构。