Kotlin中的const关键字

作者: 盛世光阴 | 来源:发表于2021-06-13 19:53 被阅读0次

    前言

    Kotlin是一种在Java虚拟机上运行的静态类型编程语言,被称之为Android世界的Swift,在GoogleI/O2017中,Google宣布Kotlin成为Android官方开发语言

    const的特点

    经过一段时间的Kotlin使用,一般来讲我们会将可变量声明为var,不可变量声明为val,并且在符合业务的情况下我们推荐使用不可变量去进行声明,可以确保代码的安全性,我们已经可以通过var val去声明可变以及不可变量,那么const是做什么用的?

    If the value of a read-only property is known at the compile time, mark it as a compile time constant using the const modifier.

    按照文档上的描述,const用于修饰在 编译时已知的只读属性

    • 用于顶层的声明,object class 或者 companion object
    • 用于字符串或者基本数据类型
    • 没有提供get方法

    编译时已知的只读属性,说明它的赋值不能是一个函数,只能是一个恒定值

    val dta = test() //正确
    const val DATA = test() //报错
    const val VALUE = ""//正确
    fun test() = ""
    

    只能用于顶层的声明,object class 或者 companion object

    const val TOP_LEVEL_CON = ""
    val TOP_LEVEL = ""
    object OBJ {
        const val OBJ_CON = ""
        val OBJ_VAL = ""
    }
    class COM_OBJ {
        val NOR_OBJ =""
        companion object {
            const val COM_CON = ""
            val COM_VAL = ""
        }
    }
    

    编译成Java代码

    public static final String TOP_LEVEL_CON = "";
    public static final String TOP_LEVEL = "";
    public final class OBJ {
       public static final String OBJ_CON = "";
       public static final String OBJ_VAL = "";
    }
    public final class COM_OBJ {
       @NotNull
       private final String NOR_OBJ = "";
       @NotNull
       public static final String COM_CON = "";
       @NotNull
       public static final String COM_VAL = "";
    }
    

    会发现在顶级声明,data class以及companion objectconst val都是被编译成了static final,再看下不同方式声明的调用情况,普通类中的val被编译成了final,看下不同情况下的调用情况

    fun test(){
        println(TOP_LEVEL_CON)
        println(TOP_LEVEL)
        println(OBJ_CON)
        println(OBJ_VAL)
        println(COM_OBJ().NOR_OBJ)
        println(COM_OBJ.COM_CON)
        println(COM_OBJ.CON_VAL)
    }
    

    编译后

    public static final void test() {
        String var0 = "";
        System.out.println(var0);
        var0 = TOP_LEVEL;
        System.out.println(var0);
        var0 = "";
        System.out.println(var0);
        var0 = OBJ.INSTANCE.getOBJ_VAL();
        System.out.println(var0);
        var0 = (new COM_OBJ()).getNOR_OBJ();
        System.out.println(var0);
        var0 = "";
        System.out.println(var0);
        var0 = COM_OBJ.Companion.getCON_VAL();
        System.out.println(var0);
    }
    

    可以发现一些区别,在调用val时会调用其get方法,但是const会直接使用赋值,也就是说
    const在使用的时候会有内联的效果,将值内联到调用处,没有提供对应的get函数

    Const的使用

    基于上述的尝试,总结下

    • 只能用于顶层的声明,object class 或者 companion object中
    • 用于字符串或者基本数据类型
    • const在使用的时候会有内联的效果,将值内联到调用处,没有提供对应的get函数

    我们在JAVA项目中经常会定义抽离一些公共的 静态常量赋值String或者基本数据类型 ,提供给 全局的多个地方频繁的调用 ,虽然Kotlin中顶级声明,object class 或者 companion object中在的valconst都可以提供静态常量给全局使用,但是由于内联的特性使用const可以避免频繁的get函数调用,在这种情况下推荐使用const

    欢迎关注Mike的简书

    Android知识整理

    相关文章

      网友评论

        本文标题:Kotlin中的const关键字

        本文链接:https://www.haomeiwen.com/subject/ktjgeltx.html