Kotlin 之 const

变量和常量

在kotlin语法中,修饰符var用来修饰可变变量,val修饰只读变量。关于val的只读属性而不是不可变属性,可以参考:val的只读属性

但是Kotlin同时又提供了一个const修饰符。在开发过程中,如果我们在伴生对象中定义了一个val类型的变量,那么Android Studio会智能的提示开发者需要使用const来修饰该变量。
Android Studio提示

const的特点

  1. const只能修饰val,不能修饰var类型变量
    在这里插入图片描述

  2. const 只允许在top-level级别和object(伴随对象也是obejct)中声明。

const val constVariable = "const_variable"

object obj{
    const val constVariable = "const_variable"
}

class ConstKotlin {
    companion object{
        const val constVariable = "const_variable"
    }
}
  1. 在java中引用不同,在kotlin中的引用
    (1)Kotlin引用
const val constVariable: String = ""
val nonConstVariable: String = ""

//object
object obj {
    const val constVariableObj: String = ""
    val nonConstVariableObj: String = ""
}

//companion object
class ConstKotlin {
    companion object {
        const val constVariableCompanion: String = ""
        val nonConstVariableCompanion: String = ""
    }
}

fun main(args: Array<String>) {
    println(constVariable)
    println(nonConstVariable)

    println(obj.constVariableObj)
    println(obj.nonConstVariableObj)

    println(ConstKotlin.constVariableCompanion)
    println(ConstKotlin.nonConstVariableCompanion)
}

(2)java引用:

 public static void main(String[] args) {
        System.out.println(ConstKotlinKt.getNonConstVariable());
        System.out.println(ConstKotlinKt.constVariable);

        System.out.println(obj.constVariableObj);
        System.out.println(obj.INSTANCE.getNonConstVariableObj());

        System.out.println(ConstKotlin.constVariableCompanion);
        System.out.println(ConstKotlin.Companion.getNonConstVariableCompanion());
    }

(1)在kotlin语法中,有没有const修饰都是直接引用的,感觉不到引用方式上有什么区别。
(2)在java语法中,没用contt修饰的,通过getter方法获取属性信息,而用了const修饰符的属性,则可以直接像java中的常量一样直接通过类引用。

const和非const的字节码区别

根据以下代码生成的字节码,编译出来的java代码。来看看二者的区别。

class ConstKotlin {
    companion object {
        const val constVariableCompanion: String = ""
        val nonConstVariableCompanion: String = ""
    }
}

关于Metadata的信息说明:Metadata说明

(1)const val 修饰的属性相当于java中的public final static修饰的常量,可以通过类名直接访问。
(2)val 修饰的属性相当于java中private final static修饰的常量,由于可见行为private,所以只能通过生成getter方法访问。
(3)出于性能考虑,使用const val方式可以避免频繁函数调用。

@Metadata(
   mv = {1, 1, 15},
   bv = {1, 0, 3},
   k = 1,
   d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0003\u0018\u0000 \u00032\u00020\u0001:\u0001\u0003B\u0005¢\u0006\u0002\u0010\u0002¨\u0006\u0004"},
   d2 = {"Lcom/jandroid/module_common/ConstKotlin;", "", "()V", "Companion", "module_common_debug"}
)
public final class ConstKotlin {
   @NotNull
   public static final String constVariableCompanion = "";
   @NotNull
   private static final String nonConstVariableCompanion = "";
   public static final ConstKotlin.Companion Companion = new ConstKotlin.Companion((DefaultConstructorMarker)null);

   @Metadata(
      mv = {1, 1, 15},
      bv = {1, 0, 3},
      k = 1,
      d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\u0004\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002R\u000e\u0010\u0003\u001a\u00020\u0004X\u0086T¢\u0006\u0002\n\u0000R\u0014\u0010\u0005\u001a\u00020\u0004X\u0086D¢\u0006\b\n\u0000\u001a\u0004\b\u0006\u0010\u0007¨\u0006\b"},
      d2 = {"Lcom/jandroid/module_common/ConstKotlin$Companion;", "", "()V", "constVariableCompanion", "", "nonConstVariableCompanion", "getNonConstVariableCompanion", "()Ljava/lang/String;", "module_common_debug"}
   )
   public static final class Companion {
      @NotNull
      public final String getNonConstVariableCompanion() {
         return ConstKotlin.nonConstVariableCompanion;
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值