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?) 

文档

相关推荐
阿巴斯甜10 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker11 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952712 小时前
Andorid Google 登录接入文档
android
黄林晴13 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android