当前位置: 首页 > 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);}
}

相关文章:

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

导读大纲 1.1.1 扩展属性的创建和使用 1.1.1 扩展属性的创建和使用 之前, 我们已经了解声明 Kotlin 属性的语法 Kotlin中的顶级属性–传送门就像扩展函数一样,我们也可以指定扩展属性就像之前所说&#xff0c;属性和函数的区别在于前者是特征&#xff0c;后者是行为 相比扩展函…...

【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置

一、引言 在上一篇文章中&#xff0c;我们开启了Spring Boot的入门之旅&#xff0c;成功构建了第一个Spring Boot应用。我们从环境搭建开始&#xff0c;详细介绍了JDK的安装以及IDE的选择与配置&#xff0c;然后利用Spring Initializr创建了项目&#xff0c;分析了项目结构&am…...

OpenCV第十二章——人脸识别

1.人脸跟踪 1.1 级联分类器 OpenCV中的级联分类器是一种基于AdaBoost算法的多级分类器&#xff0c;主要用于在图像中检测目标对象。以下是对其简单而全面的解释&#xff1a; 一、基本概念 级联分类器&#xff1a;是一种由多个简单分类器&#xff08;弱分类器&#xff09;级联组…...

深入Volatile

深入Volatile 1、变量不可见性&#xff1a; 1.1多线程下变量的不可见性 直接上代码 /*** author yourkin666* date 2024/08/12/16:12* description*/ public class h1 {public static void main(String[] args) {MyClass myClass new MyClass();myClass.start();while (tr…...

数据结构 ——— 顺序表oj题:编写函数,合并两个有序数组

目录 题目要求 代码实现 题目要求 nums1 和 nums2 是两个升序的整型数组&#xff0c;另外有两个整数 m 和 n 分别代表 nums1 和 nums2 中的元素个数 要求合并 nusm2 到nums1 中&#xff0c;使合并后的 nums1 同样按升序顺序排列 最终&#xff0c;合并后的数组不应由函数返…...

Proto文件相关知识

百度Apollo的数据结构常用proto文件来定义&#xff0c; proto文件允许你以类似于C结构体或类的方式定义数据结构。你可以在这个文件中定义简单数据类型、枚举、消息类型等。 基于proto文件&#xff0c;Protocol Buffers编译器&#xff08;protoc&#xff09;可以自动生成对应的…...

k8s的控制节点不能访问node节点容器的ip地址

master控制node服务器添加容器后,访问不了该node服务器容器的ip,只能在node服务器访问 排查后发现是k8s的master服务器和node节点的网址网段和k8s初始化时提示的ip网段不一致 我之前是192.168.137.50, 实际上master主机期望的是192.168.1.50 解决方案: 1.删除服务器后重建ma…...

鸿蒙OpenHarmony

开源鸿蒙系统编译指南 Ubuntu编译环境配置第一步&#xff1a;Shell 改 Bash第二步&#xff1a;安装Git和安装pip3工具第三步&#xff1a;远程仓配置第四步&#xff1a;拉取代码第五步&#xff1a;安装编译环境第六步&#xff1a;本地编译源码 Windows开发环境配置第一步&#x…...

把白底照片变蓝色用什么软件免费 批量更换证件照底色怎么弄

作为专业的修图师&#xff0c;有时候也会接手证件照修图和换底色工作&#xff0c;这种情况下&#xff0c;需要换底色的照片也许达到上百张。为了提高工作效率&#xff0c;一般需要批量快速修图&#xff0c;那么使用什么软件工具能够给各式不同的照片批量更换背景色呢&#xff1…...

Spring之生成Bean

Bean的生命周期&#xff1a;实例化->属性填充->初始化->销毁 核心入口方法&#xff1a;finishBeanFactoryInitialization-->preInstantiateSingletons DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。 1.preInstantiateSinglet…...

笔记整理—linux进程部分(6)进程间通信、alarm和pause

两个进程间通信可能是任何两个进程间的通信&#xff08;IPC&#xff09;。同一个进程是在同一块地址空间中的&#xff0c;在不同的函数与文件以变量进程传递&#xff0c;也可通过形参传递。2个不同进程处于不同的地址空间&#xff0c;要互相通信有难度&#xff08;内存隔离的原…...

Java网络通信—UDP

0.小记 1.udp通信不需要建立socket管道&#xff0c;一边只管发&#xff0c;一边只管收 2.客户端&#xff1a;将数据&#xff08;byte&#xff09;打包成包裹&#xff08;DatagramPacket&#xff09;&#xff0c;写上地址&#xff08;IP端口&#xff09;&#xff0c;通过快递站&…...

k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理

clusterIP作为k8s中的服务&#xff0c; 也是其他三个服务的基础 ~]$ kubectl create service clusterip externalname loadbalancer nodeport 客户端的流量到service service分发给pod&#xff0c;pod由控制器自动部署&#xff0c;自动维护 那么问题是service的可用…...

vue框架和uniapp框架区别

文章目录 vue框架和uniapp框架区别一、引言二、Vue.js 概述1、Vue.js 简介1.1、特点 2、适用场景 三、Uni-app 概述1、Uni-app 简介1.1、特点 2、适用场景 四、区别与比较1、跨平台能力2、开发体验3、性能优化4、社区和支持 五、总结 vue框架和uniapp框架区别 一、引言 在前端…...

828华为云征文 | 华为云Flexus云服务器X实例搭建Zabbix网络设备监视系统(Ubuntu服务器运维)

前言 Flexus X实例内嵌智能应用调优算法&#xff0c;性能强悍&#xff0c;基础模式GeekBench单核及多核跑分可达同规格独享型实例的1.6倍&#xff0c;性能模式更是超越多系列旗舰型云主机&#xff0c;为企业业务提供强劲动力。 &#x1f4bc; Flexus X Zabbix&#xff1a;打造…...

JAVA基础-线程(Thread)、多线程(Multi-threaded)

1、知识铺垫 要想了解什么是线程&#xff0c;首先要搞明白线程与进程的区别&#xff0c;并行与并发的区别 1.1 线程与进程 进程&#xff1a;是指⼀个内存中运⾏的应⽤程序&#xff0c;每个进程都有⼀个独⽴的内存空间&#xff0c;⼀个应⽤程序可以同时运⾏多个进程&#xff1b…...

hystrix微服务部署

目录 一.启动nacos和redis 1.查看是否有nacos和redis 二.开始项目 1.hystrix1工程&#xff08;修改一下工程的注册名字&#xff09; 2.运行登录nacos网站查看运行效果&#xff08;默认密码nacos,nacos&#xff09; 3.开启第二个项目 hystrix2工程 4.关闭第二个项目 hyst…...

使用百度文心智能体创建多风格表情包设计助手

文章目录 一、智能定制&#xff0c;个性飞扬二、多元风格&#xff0c;创意无限 百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&…...

【嵌入式裸机开发】智能家居入门3(MQTT服务器、MQTT协议、微信小程序、STM32)

前面已经写了两篇博客关于智能家居的&#xff0c;服务器全都是使用ONENET中国移动&#xff0c;他最大的优点就是作为数据收发的中转站是免费的。本篇使用专门适配MQTT协议的MQTT服务器&#xff0c;有公用的&#xff0c;也可以自己搭建 前言一、项目总览二、总体流程分析1、了解…...

css的背景background属性

CSS的background属性是一个简写属性&#xff0c;它允许你同时设置元素的多个背景相关的子属性。使用这个属性可以简化代码&#xff0c;使其更加清晰和易于维护。background属性可以设置不同的子属性。 background子属性 定义背景颜色 使用background-color属性 格式&#x…...

专业级音频编辑免费开源:Audacity 4.0 全面解析与使用指南

专业级音频编辑免费开源&#xff1a;Audacity 4.0 全面解析与使用指南 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 还在为寻找一款功能全面、易于上手且完全免费的音频编辑软件而烦恼吗&#xff1f;是否曾经因…...

labelCloud架构解析:3D点云标注的模块化解决方案深度指南

labelCloud架构解析&#xff1a;3D点云标注的模块化解决方案深度指南 【免费下载链接】labelCloud A lightweight tool for labeling 3D bounding boxes in point clouds. 项目地址: https://gitcode.com/gh_mirrors/la/labelCloud 在3D计算机视觉和自动驾驶领域&#x…...

国产 KVM 兼容痛点及全国产定制方案

作为标准 KVM、军工加固 KVM 产品经理&#xff0c;在一些项目落地过程中&#xff0c;我发现一个普遍问题&#xff1a;国产服务器、国产系统越来越普及&#xff0c;但市面上绝大多数 KVM 切换器&#xff0c;兼容性问题频发&#xff0c;已经成为运维短板。一、当前 KVM 最常见的兼…...

MATLAB集成大语言模型:无缝融合AI能力与工程计算生态

1. 项目概述&#xff1a;当MATLAB遇见大语言模型如果你是一位工程师、研究员或者数据分析师&#xff0c;并且你的日常工作离不开MATLAB&#xff0c;那么你很可能已经感受到了AI浪潮的冲击。大语言模型&#xff08;LLMs&#xff09;如ChatGPT、Llama等&#xff0c;正在重塑我们处…...

内网开发环境救星:保姆级教程搞定Docker与Docker Compose离线安装(附避坑清单)

内网开发环境救星&#xff1a;保姆级教程搞定Docker与Docker Compose离线安装&#xff08;附避坑清单&#xff09; 在企业级开发环境中&#xff0c;内网隔离是常见的安全策略&#xff0c;但这也给技术栈的部署带来了挑战。想象一下&#xff0c;当你需要在完全离线的环境中搭建一…...

避坑指南:CCPD车牌数据集预处理中,OpenCV透视变换的3个常见错误与修复方法

CCPD车牌数据集预处理实战&#xff1a;透视变换的3个隐蔽陷阱与工业级解决方案 当你在深夜的显示器前反复调试CCPD数据集的预处理代码&#xff0c;却发现透视变换后的车牌图像像被无形之手扭曲——边框错位、字符拉伸、坐标偏移。这不是算法问题&#xff0c;而是OpenCV实战中那…...

安卓android无法创建文件夹权限-幽冥大陆(一百21)-东方仙盟

谷歌从安卓 6 开始强制规定直接锁死&#xff1a;根目录 /、system、storage 根目录 全部禁止 APP 写入。目的&#xff1a;防流氓软件乱改系统、乱建文件夹、乱篡改系统文件。瑞芯微等主板厂商二次加锁RK、全志、晶晨这类工控主板&#xff0c;还额外加了两层限制&#xff1a;分区…...

音乐学者必看的NotebookLM冷启动指南,从乐谱OCR识别到和声进行语义建模,一步到位

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM在音乐学研究中的范式革命 NotebookLM&#xff08;由Google Research推出的基于用户上传文档的AI助手&#xff09;正悄然重塑音乐学研究的方法论边界。它不再依赖通用知识库的模糊匹配&#…...

北京明光云振铎数据科技Java面经

Nacos、OpenFeign、Gateway 三个组件的作用及协作流程首先&#xff1a;Nacos 主要负责服务注册发现和配置中心Gateway 作为统一网关入口&#xff0c;负责路由、鉴权、限流OpenFeign 负责服务之间的远程调用用户请求先进入 GatewayGateway 会先做 JWT 鉴权&#xff0c;比如校验 …...

基于Arduino与步进电机的DIY无线电动相机滑轨制作全攻略

1. 项目概述&#xff1a;打造你的第一台无线电动相机滑轨如果你玩摄影或者视频创作&#xff0c;肯定对那种平滑、富有电影感的平移镜头&#xff08;Dolly Shot&#xff09;着迷过。专业级的电动滑轨动辄大几千甚至上万&#xff0c;让很多个人创作者望而却步。今天&#xff0c;我…...