Kotlin:2.0.20 的新特性

news2024/12/23 13:36:59

一、概述

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.20
    val 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-446655440000
    println(uuid1 == uuid2)
// true
    println(uuid2 == uuid3)
// true

// Accesses UUID bits
    val version = uuid1.toLongs { mostSignificantBits, _ ->
        ((mostSignificantBits shr 12) and 0xF).toInt()
    }
    println(version)
// 4

// Generates a random UUID
    val randomUuid = Uuid.random()
    println(uuid1 == randomUuid)
// false
}

fun main() {
//    testConsistentCopyVisibility()
    testUUIDs()
}

运行结果
在这里插入图片描述

四、kt_2020.kt文件代码

package com.example.test.ktversion

import 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.20
    val 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-446655440000
    println(uuid1 == uuid2)
// true
    println(uuid2 == uuid3)
// true

// Accesses UUID bits
    val version = uuid1.toLongs { mostSignificantBits, _ ->
        ((mostSignificantBits shr 12) and 0xF).toInt()
    }
    println(version)
// 4

// Generates a random UUID
    val randomUuid = Uuid.random()
    println(uuid1 == randomUuid)
// false
}
fun main() {
    testConsistentCopyVisibility()
    testUUIDs()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows下载安装Minio超详细

1.下载地址 服务端文件:minio.exe 用于接收文件信息。 客户端文件:mac.exe 用于上传文件 ,如果用程序代码操作文件存储,只启动服务端即可。 #企业版 https://min.io/download?licenseenterprise&platformkubernetes#/windows #社区版(…

TiDB 性能测试的几个优化点

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/513a4eef 背景 前段时间参与了一个 TiDB 的性能测试,具体是在三台海光服务器(512G内存、128 core 分8个NUMA、4块3.5T SSD)搭建一个混合部署的 TiDB …

嵌入式中C语言小项目的具体实现

大家好,今天主要给大家分享一下,如何使用C语言来实现对应的小项目。 第一:C语言计算器实现 第二:C项目中猜字游戏实现 第三:C语言简单的日历实现 第四:C语言中每日定投债券基金一年能赚多少

浮动与网格系统

控制页面布局的工具有浮动、Flexbox 和定位等,这些工具本身没有优劣支付,只不过实现布局的方式略有不同。 1 浮动 浮动元素会脱离正常的文档流,并向左或向右移动,直到它的边缘碰到包含框或另一个浮动元素的边框为止。 文本和内联…

损失函数篇 | YOLOv5 引入Unified-IoU 高质量目标检测IoU损失

论文地址:https://arxiv.org/pdf/2408.06636 开源代码地址:https://github.com/lxj-drifter/UIOU_files 目标检测是计算机视觉领域的重要组成部分,其效果直接由预测框的回归精度决定。作为模型训练的关键,IoU(交并比)很好地展示了当前预测框与真实框(Ground Truth)之间…

数据结构——队列的基本操作

前言 介绍 🍃数据结构专区:数据结构 参考 该部分知识参考于《数据结构(C语言版 第2版)》24~28页 🌈每一个清晨,都是世界对你说的最温柔的早安:ૢ(≧▽≦)و✨ 目录 前言 1、队列的基本概念…

Flutter 3.24 AAPT: error: resource android:attr/lStar not found.

在Android build,gradle下面,添加右边红框的代码: subprojects {afterEvaluate { project ->if (project.plugins.hasPlugin("com.android.application") ||project.plugins.hasPlugin("com.android.library")) {project.androi…

复写零——双指针算法

题目链接 复写零https://leetcode.cn/problems/duplicate-zeros/description/ 题目要求 样例 题目分析 先看示例1,题目要求将数组中所有的0,均复写一遍,且要在原数组上进行更改,多余的元素消失 但我们发现,如果双指针…

04DSP学习-利用syscfg配置EPWM

打开syscfg文件,左侧control栏中找到EPWM,点击,发现TI提供了一些帮助文档,帮助了解如何使用syscfg以及如何了解EPWM。我们结合配置过程去理解如何使用。 设计目标 使用EPWM1;增减计数;PWM频率为10kHz&…

ios内购支付-支付宝APP支付提现

文章目录 前言一、IOS内购支付(ios订单生成自己写逻辑即可)1.支付回调票据校验controller1.支付回调票据校验server 二、安卓APP支付宝支付1.生成订单返回支付宝字符串(用于app拉起支付宝,这里用的是证书模式)2.生成订…

相机基础概念

景深: 景深的定义 DOF:depth of filed 是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。光圈、镜头、及焦平面到拍摄物的距离是影响景深的重要因素。定义3:在镜头前方(焦点的前、后)有一…

PCL 投影滤波器

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 投影滤波 2.1.2 可视化 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、…

Java的栈帧和动态链接是什么?

在 Java 的面试过程中,不可避免的一个面试题那就是 JVM,而 JVM 的面试题中,有各种,比如在堆中会被问到的关于垃圾回收机制的相关问题,在栈中会被问到入栈以及出栈的过程,来聊一下关于栈的相关问题&#xff…

【EchoMimic整合包及教程】蚂蚁集团支付宝开源了数字人技术EchoMimic,可用于虚拟主播、视频编辑等

蚂蚁集团支付宝开源了数字人技术EchoMimic,可用于虚拟主播和视频编辑。EchoMimic是一个音频驱动的肖像动画生成工具,具有丰富的表情和流畅的动作。它支持音频驱动、姿势驱动和音频与姿势混合驱动动画,并提供了易于使用的WebUI和GradioUI界面。…

三品PLM系统如何提升企业产品研发效率?

三品PLM系统如何提升企业研发效率 在竞争日益激烈的市场环境中,企业研发效率的高低直接决定了其产品的上市速度、质量以及市场竞争力。为了应对这一挑战,越来越多的企业开始引入PLM系统,而三品PLM系统凭借其强大的功能和全面的解决方案&…

移动技术开发:音乐播放器

1 实验名称 音乐播放器 2 实验目的 掌握使用Service启动服务的方法&#xff0c;掌握BroadcastReceiver广播传递机制的实现&#xff0c;利用Activity、Service和BroadcastReceiver实现一个音乐播放器APP。 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.…

yum无法使用解决办法

yum无法使用解决方法&#xff08;比较全&#xff0c;以后如果遇到别的问题还会添加&#xff09;yum无法使用解决方法&#xff08;比较全&#xff0c;以后如果遇到别的问题还会添加&#xff09; 如下&#xff0c;新装的linux虚拟机&#xff0c;yum安装wget报错 Cannot find a …

内存占用估算方法

优质博文&#xff1a;IT-BLOG-CN 通过掌握每种数据类型的大小&#xff0c;就可以更准确地预测对象和数据的内存消耗。 一、基础数据类型 Java基础数据类型结构&#xff0c;在64位系统开启指针压缩情况下的内存占用字节数&#xff1a; booleanbytecharshortintlongfloatdoub…

D23【 python 接口自动化学习】- python 基础之判断与循环

day23 match语句 学习日期&#xff1a;20240930 学习目标&#xff1a;判断与循环 --33 match语句&#xff1a;如何通过match关键字来处理程序的分支逻辑&#xff1f; 学习笔记&#xff1a; match语句的语法 基本写法 代码实现&#xff08;后续更新为自己写的代码&#xff…

软件测试学习笔记丨Mock的价值与实战

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32331 一、Mock的价值与意义 1.1 简介 测试过程中&#xff0c;对于一些不容易构造或获取的对象&#xff0c;用一个虚拟的对象来替代它&#xff0c;达到相同的效果&#xff0c;这个虚拟的对象…