Kotlin 值类(Value Class)

在 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 得到:

java 复制代码
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 method
    public 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?) 

文档

相关推荐
jinyishu_4 分钟前
C++ 继承全解:从基础到高级特性
开发语言·c++
AFinalStone1 小时前
Android 7系统网络(八)应用API层—ConnectivityManager使用与实战调试
android·网络
plainGeekDev2 小时前
kapt 替换为 KSP
android·java·kotlin
蜡台2 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
小喻同学i2 小时前
std::thread函数参数传递
开发语言·c++
Ulyanov3 小时前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头
分布式存储与RustFS4 小时前
RustFS Beta.10 性能解读:PUT 全面反超 MinIO,Rust 重写对象存储成了?
开发语言·后端·rust
小小的木头人4 小时前
Python 批量解析 Excel 经纬度,调用高德地图 API 获取中文地址
开发语言·python·excel
nzz_1712145 小时前
PHP程序员转型AI岗位指南:核心技能、北京就业市场与转型路径分析
开发语言·人工智能·php
Risehuxyc5 小时前
C# 将doc转换为docx
开发语言·c#·xhtml