扩展函数是允许在现有类中添加新功能的机制,无需继承或修改该类本身。
例如,对于 String 类,添加一个反转字符串的函数:
fun String.reverse(): String { return this.reversed() } println("abc".reverse()) // "cba"
扩展实际上并不修改类,而只是语法糖:它们被编译为静态方法,接受对象实例作为第一个参数。
优点: 简洁性、可读性、可扩展性。适合用于集合、字符串等的工具函数。
潜在问题:
能否通过扩展函数向类添加一个新的变量(属性),用于存储状态?
答: 不能。扩展属性总是可计算的属性(getter/setter),而不是字段。它们不能存储状态——只能即时计算。
val String.secondChar: Char get() = this[1] // 仅计算,不存储!
故事
在数据验证项目中,开发人员将扩展属性添加到模型类中,仿佛它会存储值,但后来发现该值始终被计算,而不是记住,这导致在多次调用时逻辑不正确。
故事
在一个大型应用程序中,扩展名称与类的方法相同,导致混淆:类的方法始终优先,扩展未被调用——花了一天时间调试“看不见”的代码。
故事
在某个库中,扩展用于类的私有字段,但后来发现它们根本无法访问私有属性,因此不得不重构模型的架构。