Kotlin 之 const
Posted android小菜比
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 之 const相关的知识,希望对你有一定的参考价值。
变量和常量
在kotlin语法中,修饰符var用来修饰可变变量,val修饰只读变量。关于val的只读属性而不是不可变属性,可以参考:val的只读属性
但是Kotlin同时又提供了一个const修饰符。在开发过程中,如果我们在伴生对象中定义了一个val类型的变量,那么android Studio会智能的提示开发者需要使用const来修饰该变量。
const的特点
-
const只能修饰val,不能修饰var类型变量
-
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"
- 在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();
以上是关于Kotlin 之 const的主要内容,如果未能解决你的问题,请参考以下文章