Kotlin 值类(Value Class)

ops/2024/9/24 13:13:30/

在 Java 中,像 IntegerDouble 等都是 包装类,都需要创建对象 装箱 数值。
很显然 创建对象是 消耗额外内存的,而 对于优化这种问题,Kotlin 引入了 value class,尽量避免装箱和脱箱。

一、声明语法

kotlin">@JvmInline
value class XXX(val value: Type)

使用 和 正常类,没有区别。

Jetpet Compose 中,Dp 就是典型的value class应用:

kotlin">@JvmInline
value class Dp(val value: Float)

二、JVM实现分析

说明: value class 会(尽可能)避免创建包装类对象,而是直接使用 基本数据类型。而 对应的类成员方法 以 类静态方法 传入 value 值 来实现执行。

这里定义 尺寸 Pt 单位为例:

kotlin">@JvmInline
value class Pt(private val value: Int) {fun print() {println("pt: $value")}
}fun main() {val pt = Pt(10)pt.print()
}

通过 Show Kotlin Bytecode -> Decompile 得到:

public final class Pt {private final int value;// print 转成了 静态方法public static final void print_impl(int arg0) {String var1 = "pt: " + arg0;System.out.println(var1);}
}public final class MainKt {public static final void main() {// 优化成 基本类型 int,不需要 装箱int pt = Pt.constructor-impl(10);// 而 直接调用Pt.print-impl(pt);}// $FF: synthetic methodpublic static void main(String[] args) {main();}}

说明: 上面说到 尽可能 创建和使用 包装对象,但是 当 Pt? 这种可空的时候,就会使用 包装类 传递参数。

简单举例,创建 Pt 为参数的方法:

kotlin">// 编译 成 java 则是 testPt(int pt)
fun testPt(pt: Pt) // 而 下面 则编译成 testPt(@Nullable Pt pt)
fun testPt(pt: Pt?) 

文档

  • Inline value classes
  • Design Notes on Kotlin Value Classes

http://www.ppmy.cn/ops/93032.html

相关文章

【数据结构与算法 | 力扣+二叉搜索树篇】力扣450, 98

1. 力扣450:删除二叉搜索树的节点 1. 题目: 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引…

第二章 部署LVS-DR

DR模式的调度器和节点服务器都有VIP地址,但节点服务器的VIP在回环网卡,回环网卡的地址只能本机看到,外部主机看不到,所以不会冲突。 一、DR模式的简单过程 DR模式的具体过程:首先客户端.135向目标vip发出请求&#x…

2-17、18 HC06蓝牙模块(meArm机械臂)

2-17、18 HC06蓝牙模块(meArm机械臂) 2-17 HC06蓝牙模块-1RX引脚分压电路HC06连接与arduino的电路HC06蓝牙模块应用程序测试程序1:使用Arduino通过无线蓝牙控制Arduino引脚11的LED点亮/熄灭测试程序2:使用Arduino通过无…

67、ceph

一、ceph 1.1、ceph概念 ceph是一个开源的,用c语言写的分布式的存储系统。存储文件数据。 /dev/sdb fdisk /dev/sdb gdisk /dev/sdb lvm 逻辑卷 可以扩容 raid 磁盘阵列 高可用 基于物理意义上的单机的存储系统。 分布式有多台物理磁盘组成一个集群&…

编程-设计模式 23:模板方法模式

设计模式 23:模板方法模式 定义与目的 定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。目的:该模式的主要目的是封装算法的…

从入门到精通:接入视频美颜SDK与直播美颜插件详解

本篇文章,笔者将为你详细解析美颜SDK从入门到精通的全过程,帮助你轻松掌握这项技术。 一、什么是视频美颜SDK与直播美颜插件? 视频美颜SDK是一组预构建的代码库和工具,开发者可以将其嵌入到移动应用或平台中,从而实现…

haproxy原理及实验演示(实现服务器集群的负载均衡)

haproxy介绍 HAProxy是一个使用C语言编写的自由及开放源代码软件,由法国人Willy Tarreau开发。它是一款高性能的TCP和HTTP负载均衡器,特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理(这是他和lvs功能上的…

预测云计算的未来

云计算的未来是否依旧未知? 直到最近,云计算还是软件编程界之外很少有人熟悉的一个概念。如今,云计算已成为一切的基础,从点播电视服务和在线游戏门户网站到电子邮件和社交媒体,这四大现代世界的基石。云计算将继续存在…