Kotlin:2.0.20 的新特性
一、概述
Kotlin 2.0.20英文版官方文档
Kotlin 2.0.20发布了!这个版本包括对Kotlin 2.0.0的性能改进和bug修复,我们在其中宣布Kotlin K2编译器为Stable。以下是本次发布的一些亮点:
- 数据类复制函数将具有与构造函数相同的可见性
- 来自默认目标层次结构的源集的静态访问器现在可以在多平台项目中使用
- Kotlin/Native的并发标记已经在垃圾收集器中成为可能
- Kotlin/Wasm中的@ExperimentalWasmDsl注释有一个新位置
- Gradle 8.6-8.8版本增加了支持
- 一个新的选项允许在Gradle项目之间以类文件的形式共享JVM工件
- 撰写编译器已更新
- 对uuid的支持已添加到公共Kotlin标准库中
二、数据类复制函数与构造函数具有相同的可见性
Kotlin 2.0.20开始引入更改,以提高数据类的一致性,并替换实验性上下文接收器特性。
目前,如果使用私有构造函数创建数据类,则自动生成的copy()函数不具有相同的可见性。这可能会在稍后的代码中导致问题。在未来的Kotlin版本中,我们将引入copy()函数的默认可见性与构造函数相同的行为。此更改将逐步引入,以帮助您尽可能顺利地迁移代码。
我们的迁移计划从Kotlin 2.0.20开始,它会在代码中发出警告,将来可见性会发生变化。例如:
// Triggers a warning in 2.0.20
data class PositiveInteger private constructor(val number: Int) {companion object {fun create(number: Int): PositiveInteger? = if (number > 0) PositiveInteger(number) else null}
}/*** 数据类复制函数与构造函数具有相同的可见性* * @ConsistentCopyVisibility 用于标记一个类或接口,以表明其副本在可见性方面应该是一致的。换句话说,当你创建一个类的副本时,副本的可见性应该与原始类实例的可见性相匹配。*/
fun testConsistentCopyVisibility(){val positiveNumber = PositiveInteger.create(42) ?: return// Triggers a warning in 2.0.20val negativeNumber = positiveNumber.copy(number = -1)// Warning: Non-public primary constructor is exposed via the generated 'copy()' method of the 'data' class.// The generated 'copy()' will change its visibility in future releases.
}fun main() {testConsistentCopyVisibility()
}
运行结果
报错信息
Non-public primary constructor is exposed via the generated 'copy()' method of the 'data' class.The generated 'copy()' will change its visibility in future releases.To suppress the warning do one of the following:
- Annotate the data class with the '@ConsistentCopyVisibility' annotation.
- Use the '-Xconsistent-data-class-copy-visibility' compiler flag.
- Annotate the data class with the '@ExposedCopyVisibility' annotation (Discouraged, but can be used to keep binary compatibility).To learn more, see the documentation of the '@ConsistentCopyVisibility' and '@ExposedCopyVisibility' annotations.
为了对这种行为有更多的控制,在Kotlin 2.0.20中,我们引入了两个注释:
- @ConsistentCopyVisibility现在就可以选择加入该行为,否则我们会在以后的版本中将其设为默认值。
- @ExposedCopyVisibility选择退出该行为,并在声明站点上抑制警告。注意,即使有了这个注释,当调用copy()函数时,编译器仍然会报告警告。
如果您想为整个模块而不是单个类选择2.0.20中已经有的新行为,您可以使用-Xconsistent-data-class-copy-visibility编译器选项。该选项与在模块中的所有数据类中添加@ConsistentCopyVisibility注释具有相同的效果。
三、标准库
标准库现在支持通用唯一标识符作为实验特性,并包括对Base64解码的一些更改。
3.1 在通用Kotlin标准库中支持uuid
本特性是实验性的。要选择加入,请使用@ExperimentalUuidApi注释或编译器选项-opt-in=kotlin.uuid.ExperimentalUuidApi。
Kotlin 2.0.20引入了一个类来表示通用Kotlin标准库中的uuid(通用唯一标识符),以解决唯一标识项的问题。
此外,该特性还为以下uuid相关操作提供了api:
- 生成uuid。
- 解析uid并将其格式化为字符串表示形式。
- 从指定的128位值创建uuid。
- 访问UUID的128位。
下面的代码示例演示了这些操作:
@OptIn(ExperimentalUuidApi::class)
fun testUUIDs(){val byteArray = byteArrayOf(0x55, 0x0E, 0x84.toByte(), 0x00, 0xE2.toByte(), 0x9B.toByte(), 0x41, 0xD4.toByte(),0xA7.toByte(), 0x16, 0x44, 0x66, 0x55, 0x44, 0x00, 0x00)val uuid1 = Uuid.fromByteArray(byteArray)val uuid2 = Uuid.fromULongs(0x550E8400E29B41D4uL, 0xA716446655440000uL)val uuid3 = Uuid.parse("550e8400-e29b-41d4-a716-446655440000")println(uuid1)
// 550e8400-e29b-41d4-a716-446655440000println(uuid1 == uuid2)
// trueprintln(uuid2 == uuid3)
// true// Accesses UUID bitsval version = uuid1.toLongs { mostSignificantBits, _ ->((mostSignificantBits shr 12) and 0xF).toInt()}println(version)
// 4// Generates a random UUIDval randomUuid = Uuid.random()println(uuid1 == randomUuid)
// false
}fun main() {
// testConsistentCopyVisibility()testUUIDs()
}
运行结果
四、kt_2020.kt文件代码
package com.example.test.ktversionimport kotlin.uuid.ExperimentalUuidApi
import kotlin.uuid.Uuid//https://kotlinlang.org/docs/whatsnew2020.html
// Triggers a warning in 2.0.20// 数据类复制函数与构造函数具有相同的可见性
@ConsistentCopyVisibility
//data class PositiveInteger private constructor(val number: Int) {
//报错信息:Cannot access 'fun copy(number: Int = ...): PositiveInteger': it is private in
data class PositiveInteger constructor(val number: Int) {companion object {fun create(number: Int): PositiveInteger? = if (number > 0) PositiveInteger(number) else null}
}/*** 数据类复制函数与构造函数具有相同的可见性** @ConsistentCopyVisibility 用于标记一个类或接口,以表明其副本在可见性方面应该是一致的。换句话说,当你创建一个类的副本时,副本的可见性应该与原始类实例的可见性相匹配。*/
fun testConsistentCopyVisibility(){val positiveNumber = PositiveInteger.create(42) ?: return// Triggers a warning in 2.0.20val negativeNumber = positiveNumber.copy(number = -1)// Warning: Non-public primary constructor is exposed via the generated 'copy()' method of the 'data' class.// The generated 'copy()' will change its visibility in future releases.
}// https://kotlinlang.org/docs/whatsnew2020.html#standard-library
// 通用的标准库支持 UUIDs
// Constructs a byte array for UUID creation
@OptIn(ExperimentalUuidApi::class)
fun testUUIDs(){val byteArray = byteArrayOf(0x55, 0x0E, 0x84.toByte(), 0x00, 0xE2.toByte(), 0x9B.toByte(), 0x41, 0xD4.toByte(),0xA7.toByte(), 0x16, 0x44, 0x66, 0x55, 0x44, 0x00, 0x00)val uuid1 = Uuid.fromByteArray(byteArray)val uuid2 = Uuid.fromULongs(0x550E8400E29B41D4uL, 0xA716446655440000uL)val uuid3 = Uuid.parse("550e8400-e29b-41d4-a716-446655440000")println(uuid1)
// 550e8400-e29b-41d4-a716-446655440000println(uuid1 == uuid2)
// trueprintln(uuid2 == uuid3)
// true// Accesses UUID bitsval version = uuid1.toLongs { mostSignificantBits, _ ->((mostSignificantBits shr 12) and 0xF).toInt()}println(version)
// 4// Generates a random UUIDval randomUuid = Uuid.random()println(uuid1 == randomUuid)
// false
}
fun main() {testConsistentCopyVisibility()testUUIDs()
}
相关文章:

Kotlin:2.0.20 的新特性
一、概述 Kotlin 2.0.20英文版官方文档 Kotlin 2.0.20发布了!这个版本包括对Kotlin 2.0.0的性能改进和bug修复,我们在其中宣布Kotlin K2编译器为Stable。以下是本次发布的一些亮点: 数据类复制函数将具有与构造函数相同的可见性来自默认目标层次结构的源集的静态访…...

Python内存管理与泄漏排查实战
Python内存管理与泄漏排查实战 Python作为一种高级编程语言,因其易读性和丰富的标准库而备受开发者青睐。然而,随着项目的复杂度增加,内存管理问题可能会影响程序的性能,甚至导致内存泄漏。为了构建健壮且高效的应用程序…...

828华为云征文|华为云Flexus云服务器X实例搭建部署H5美妆护肤分销商城、前端uniapp
准备国庆之际,客户要搭个 H5 商城系统,这系统好不容易开发好啦,就差选个合适的服务器上线。那可真是挑花了眼,不知道哪款性价比高呀!就像在琳琅满目的选择前。最终慧眼识珠,选择了华为云 Flexus X。至于为什…...

初学51单片机之I2C总线与E2PROM二
总结下上篇博文的结论: 1:ACK信号在SCL为高电平期间会一直保持。 2:在字节数据传输过程中如果发送电平跳变,那么电平信号就会变成重复起始或者结束的信号。(上篇博文的测试方法还是不能够明确证明这个结论࿰…...

Kafka学习笔记(一)Kafka基准测试、幂等性和事务、Java编程操作Kafka
文章目录 前言4 Kafka基准测试4.1 基于1个分区1个副本的基准测试4.2 基于3个分区1个副本的基准测试4.3 基于1个分区3个副本的基准测试 5 Java编程操作Kafka5.1 引入依赖5.2 向Kafka发送消息5.3 从Kafka消费消息5.4 异步使用带有回调函数的生产消息 6 幂等性6.1 幂等性介绍6.2 K…...
结合vueuse实现图片懒加载
介绍 为什么要有懒加载? 在一个网页中如果有很多张图片,那么用户初进这个页面的时候不必一次性把所有图片都加载出来,否则容易造成卡顿和浪费。应该是,用户的视图页面滑到该图片的位置,然后再把该图片加载出来。 前置…...

Mysql数据库--聚合查询、分组查询、联合查询(不同的连接方式)
文章目录 1.查询的进阶版1.1查询搭配插入进行使用1.2聚合查询1.3group by分组查询1.4联合查询之笛卡尔积1.5左外连接,右外连接介绍join on1.6自连表 1.查询的进阶版 1.1查询搭配插入进行使用 我们首先创建两张表,一个叫做student,一个叫做student2,两个…...

计算机视觉——图像修复综述篇
目录 1. Deterministic Image Inpainting 判别器图像修复 1.1. sigle-shot framework (1) Generators (2) training objects / Loss Functions 1.2. two-stage framework 2. Stochastic Image Inpainting 随机图像修复 2.1. VAE-based methods 2.2. GAN-based methods …...
集中式架构和分布式架构
数据是企业的核心资产和战略资源。面对爆炸性的数据增长,如何有效地组织、管理和利用数据成为企业的重大挑战。数据架构作为企业数据管理的蓝图和框架,发挥重要作用。本文就来详细说下当下主流的两种数据架构的类型。 首先明确数据架构定义:…...
Redis: 集群高可用之故障转移和集群迁移
故障转移 故障转移,包括自动故障转移和手动故障转移 1 )自动故障转移 Redis 集群,主节点挂了,从节点可以顶上来继续提供服务常用制造故障的两种方式 第一,对其中一个节点进行 SHUTDOWN 操作第二,kill 掉…...
记账软件在线、会计记账网站、财务记账官网、记账云、云记账、在线免费做账以及易舟云财务软件
记账软件在线、会计记账网站、财务记账官网、记账云、云记账、在线免费做账以及易舟云财务软件,以下是一些详细的介绍和推荐: 一、记账软件在线与会计记账网站 记账软件和会计记账网站是现代财务管理中不可或缺的工具,它们能够帮助企业或个人…...
Elasticsearch基础_3.基础操作
文章目录 一、索引操作1.1、创建索引1.2、删除索引 二、映射操作2.1、查看映射2.2、扩展映射 三、文档操作3.1、单条写入文档3.2、更新单条文档3.3、查看单条文档3.4、删除单条文档3.5、根据条件删除文档 一、索引操作 1.1、创建索引 PUT /${index_name} {"settings&quo…...
PHP永久性Cookie的含义
PHP中的永久性Cookie(也称为持久性Cookie)是指在用户的计算机上存储的一种持久性的HTTP Cookie。与常规的临时Cookie不同,永久性Cookie在浏览器关闭后依然保留,并且可以在用户下次访问该网站时被读取和使用。 主要特点 持久存储…...

瑜伽培训行业为何要搭建自己的专属知识付费小程序平台?集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统
在当今快节奏的生活中,瑜伽作为一种舒缓压力、增强体质的生活方式,受到了越来越多人的青睐。瑜伽培训行业也随之蓬勃发展,但如何在激烈的市场竞争中脱颖而出,成为众多瑜伽培训机构面临的一大挑战。搭建自己的专属知识付费小程序平…...

FFT 分析进阶-笔记
FFT 分析进阶 边界不连续与泄漏效应解决方法增加窗函数海宁窗与哈布什窗混叠效应频率高到什么程度会出现混叠现象呢?那我们有办法去应对这个混叠吗?经典平均指数平均关于结果的显示模式FFT计算的三个常见的范例计算FFT图谱中某一段的总值,图中…...

毕业设计_基于springboot+layui+mybatisPlus的中小型仓库物流管理系统源码+SQL+教程+可运行】41004
毕业设计_基于springbootlayuimybatisPlus的中小型仓库物流管理系统源码SQL教程可运行】41004 下载地址: https://download.csdn.net/download/qq_24428851/89843203 技术栈 后端:springboot、mybatis-plus、shiro 前端:layUI 存储&…...

ROS基础入门——实操教程
ROS基础入门——实操教程 前言 本教程实操为主,少说书。可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细繁杂了,看得脑壳疼,于是做了这个笔记。 Ruby Rose,放在这里相当合理 本文初编辑于2024年10月4日 C…...

etcd 快速入门
简介 随着go与kubernetes的大热,etcd作为一个基于go编写的分布式键值存储,逐渐为开发者所熟知,尤其是其还作为kubernetes的数据存储仓库,更是引起广泛专注。 本文我们就来聊一聊etcd到底是什么及其工作机制。 首先,…...

Spring MVC__HttpMessageConverter、拦截器、异常处理器、注解配置SpringMVC、SpringMVC执行流程
目录 一、HttpMessageConverter1、RequestBody2、RequestEntity3、ResponseBody4、SpringMVC处理json5、SpringMVC处理ajax6、RestController注解7、ResponseEntity7.1、文件下载7.2、文件上传 二、拦截器1、拦截器的配置2、拦截器的三个抽象方法3、多个拦截器的执行顺序 三、异…...

GAMES101(19节,相机)
相机 synthesis合成成像:比如光栅化,光线追踪,相机是capture捕捉成像, 但是在合成渲染时,有时也会模拟捕捉成像方式(包括一些技术 动态模糊 / 景深等),这时会有涉及很多专有名词&a…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...