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

【解密 Kotlin 扩展函数】扩展属性与扩展函数类似(十九)

导读大纲

      • 1.1.1 扩展属性的创建和使用

1.1.1 扩展属性的创建和使用

  1. 之前, 我们已经了解声明 Kotlin 属性的语法

    • Kotlin中的顶级属性–传送门
    • 就像扩展函数一样,我们也可以指定扩展属性
    • 就像之前所说,属性和函数的区别在于前者是特征,后者是行为
      1. 相比扩展函数,扩展属性无非就是使用属性访问语法来访问扩展功能
  2. 在上一节中,我们定义扩展函数 lastChar()

    • 扩展函数 lastChar()–传送门
    • <1> 让我们把它转换成一个属性,这样就可以调用 “myText”.lastChar
    • 与函数一样,扩展属性看起来就像添加接收器类型的普通属性
      1. 必须始终定义getter,因为没有后备字段
        • 扩展属性就是通过自定义 getter 访问器来实现对已有类的功能扩展
      2. 由于这里的实现比较简单, 所以使用表达式体的形式定义get()
val String.lastChar: Char           // <1>get() = get(length - 1)
fun main() {println("Kotlin".lastChar)      // <1>
}
  1. 如果在 StringBuilder 上定义 lastChar 属性
    • <1> 可以将其作为 var, 因为 StringBuilder 的内容可以被修改
    • <2> 访问扩展属性与访问成员属性完全相同
    • <3> 这里直接通过赋值来调用扩展属性的setter访问器
      1. setter访问器内部可以调用接收器对象的任意方法,比如这里的setCharAt
var StringBuilder.lastChar: Char                // <1>get() = this.get(length - 1)set(value) {                                // <1>this.setCharAt(length - 1, value)       // <3>}
fun main() {println("Kotlin".lastChar)val sb = StringBuilder("Kotlin?")           // <2>println(sb.lastChar)                        // <2>// ?sb.lastChar = '!'                           // <3>println(sb)// Kotlin!
}
  1. 请注意,当需要从 Java 访问扩展属性时,必须明确调用其getter和setter
    • <1> 在Java中遵照 Java 的属性调用惯例来调用xxx.getLastChar(sb)
      1. 从这里看出扩展属性的本质还是静态性
      2. 底层其实还是挂载在 StringFunctions 类下静态方法
        • StringFunctions是通过注解"JvmName"来指定的, 这里不再赘述
import strings.StringFunctions;
public class Example {public static void main(String[] args){StringBuilder sb = new StringBuilder("Kotlin?");System.out.println(StringFunctions.getLastChar(sb));  // <1>StringFunctions.setLastChar(sb,'!');                  // <1>System.out.println(sb);}
}
http://www.lryc.cn/news/452051.html

相关文章:

  • 【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置
  • OpenCV第十二章——人脸识别
  • 深入Volatile
  • 数据结构 ——— 顺序表oj题:编写函数,合并两个有序数组
  • Proto文件相关知识
  • k8s的控制节点不能访问node节点容器的ip地址
  • 鸿蒙OpenHarmony
  • 把白底照片变蓝色用什么软件免费 批量更换证件照底色怎么弄
  • Spring之生成Bean
  • 笔记整理—linux进程部分(6)进程间通信、alarm和pause
  • Java网络通信—UDP
  • k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理
  • vue框架和uniapp框架区别
  • 828华为云征文 | 华为云Flexus云服务器X实例搭建Zabbix网络设备监视系统(Ubuntu服务器运维)
  • JAVA基础-线程(Thread)、多线程(Multi-threaded)
  • hystrix微服务部署
  • 使用百度文心智能体创建多风格表情包设计助手
  • 【嵌入式裸机开发】智能家居入门3(MQTT服务器、MQTT协议、微信小程序、STM32)
  • css的背景background属性
  • Cypress自动化测试实战:构建高效的前端测试体系
  • 【YOLO学习】YOLOv2详解
  • windows 录音编码为flv格式时,pcm采样格式
  • Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite
  • 51c自动驾驶~合集1
  • Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进
  • PHP魔幻(术)方法
  • VS开发 - 静态编译和动态编译的基础实践与混用
  • Golang | Leetcode Golang题解之第451题根据字符出现频率排序
  • 零信任如何增强网络物理系统 (CPS) 安全性
  • V3D——从单一图像生成 3D 物体