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

news/2024/9/30 10:09:47 标签: kotlin, 开发语言, java, jvm

导读大纲

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

1.1.1 扩展属性的创建和使用

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

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

    • 扩展函数 lastChar()–传送门
    • <1> 让我们把它转换成一个属性,这样就可以调用 “myText”.lastChar
    • 与函数一样,扩展属性看起来就像添加接收器类型的普通属性
      1. 必须始终定义getter,因为没有后备字段
        • 扩展属性就是通过自定义 getter 访问器来实现对已有类的功能扩展
      2. 由于这里的实现比较简单, 所以使用表达式体的形式定义get()
kotlin">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
kotlin">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"来指定的, 这里不再赘述
kotlin">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.niftyadmin.cn/n/5684871.html

相关文章

智慧校园建设方案(第四章)

4 建设内容 科技职业学院数字孪生校园一张图平台包括标准规范体系建立、数据建设、数字孪生校园一张图底座、珍稀植物可视化应用、图书馆可视化应用、宿舍可视化应用、教室可视化应用、实训室可视化应用、珍稀植物养护小程序、运维管理系统和接口对接,下面分别对平台的各个功…

Ansible集群服务部署案例

案例描述 本案例共讲述了多个节点部署Elk集群日志分析系统&#xff0c;分别在三个节点使用ansible部署Kibana、Logstash以及Elasticsearch服务。 案例准备 1. 规划节点 IP 主机名 节点 192.168.100.25 ansible Ansible节点 192.168.100.35 node1 Elasticsearch/Kiba…

wpa_cli支持EAP-PEAP认证运行设计

wpa_cli支持EAP-PEAP认证运行设计 1 输入 1.1 启动wpa_supplicant 和 wpa_cli 启动wpa_supplicant 和 wpa_cli 在OpenHarmony开发板或华为开发机的命令行中输入 wpa_supplicant -Dnl80211 -c/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf -gabstract:…

Kafak入门技术详解

抱歉&#xff0c;没有太多的时间进行详细校对 目录 一、Kafka简介 1.消息队列 1.1为什么需要消息队列 1.2消息队列 1.3消息队列的分类 1.4P2P和发布订阅MQ的比较 1.5消息系统的使用场景 1.6常见的消息系统 2.Kafka简介 2.1简介 2.2设计目标 2.3 kafka核心的概念 二…

Spring自动装配的5种方式

Spring自动装配的5种方式 1. no&#xff08;默认&#xff09;2. byName3. byType4. constructor5. autodetect &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Spring提供了五种自动装配方式&#xff0c;旨在帮助开发者简化Bean依赖的配置过…

ArcGIS10.2微开发记录

1、修改ArcMap的字段属性 使用Arcgis处理数据过程中,经常会遇到字段长度不够或太长的情况,需要修改字段属性。在ArcMap中字段属性是无法修改的,仅别名可以修改。 打开ArcCatalog,找到图层存放的位置,然后右击图层,选择Export /To Geodatabase (Single); 打开Feature …

【Linux】如何用shell脚本一键安装Java和Maven环境

Shell脚本安装环境 前言脚本Java安装脚本使用方式 Java卸载脚本Maven安装脚本Maven卸载脚本 前言 无论是在云服务器上部署Java项目 还是在本地的Linux虚拟机上运行Java项目 都需要Java的环境 设置环境则需要一些繁琐的操作 为了简化并复用这些操作 我们可以封装这些操作为一个…

【Immich部署与访问】自托管媒体文件备份服务 Immich 本地化部署与远程访问存储数据

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 本篇文章介绍如何在本地搭建lmmich图片管理软件&#xff0c;并结合cpolar内网穿透实现公网远程访问到局域网内的lmmich&#…