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

文档

相关推荐
编程零零七1 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
Dingdangr2 小时前
Android中的Intent的作用
android
技术无疆2 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
2401_858286112 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
GEEKVIP2 小时前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑
铁松溜达py2 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy2 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
C-SDN花园GGbond4 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处5 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ5 小时前
Java 23 的12 个新特性!!
java·开发语言·学习