第一次尝试这种写作风格,如果你觉得这种风格可行,点个赞吧,这对我很重要。
val
val用来申明:只读变量【read-only】。
也就相当于,java中final修饰的变量。这比较容易理解。
const
const用来申明:编译期的常量【Compile-Time Constants】
const修饰的常量需要同时满足以下三个条件:
只能是:字符串和基础类型。【
String
or a primitive type】
只能修饰:全局常量【top level】、object的成员、companion 对象的成员
const不能单独修饰某个变量,必须和val同时修饰一个变量。
也就是说const val 必须同时出现。
const val
修饰的的变量,一定是编译时的常量,在编译期就知道他的值了。不需要依赖运行时创建的任何变量。
而val申明的变量,是只读变量。只能赋值一次,可以是运行期间赋值。
编译时常量,属于只读变量的一种特殊情况。
const的好处
在java代码中引用kotlin的变量时,不能直接使用val
的变量,但可以直接使用const val
的变量.
如下kotlin代码:
奥,这就有意思了。
无const修饰的编译期常量,不仅在java代码中不能直接访问,并且还会生成相应的getXXX()方法。
这就很有意思了,如上常量:VAL_STRING,会自动生成方法:NormalClass.Companion.getVAL_STRING()。
所以能用const val
的变量就不要只用val
,因为这样不优雅,编译性能也比const val
更低。const val
不会生成相应的getXXX()
方法。
我们来看看这是怎么回事?
我们看看NormalClass会被编译成什么样?转成相应的java代码看看。
-
kotlin代码
class NormalClass{ companion object{ const val CONST_VAL_STRING = "constValString" val VAL_STRING = "valString" } }
-
转成java 代码,看看真相