目录
向KotlinAction中函数的进阶理解
最近工作繁忙,心得体会难以总结;偶得闲时,查阅Kotlin Action,笔录心得。
顶层函数与属性的意义与本质
消除特定一些仅包含静态函数容器类例如JDK中的Collections,其顶层函数与属性不在需要被容器类包裹,只位于代码文件中的顶层,并不属于任何类,并且其顶层函数仍然能成为包内成员,仅仅需要使用import进行导入。
其写法如下:
@file:JvmName("TLFAADemo")
package kotlin_demo.function
/**
* 所谓顶层函数:去除包裹静态函数类容器,使其存在包内,简化类的创建,实则在jvm运行编译的时候还是会创建一个类,
* 如果没有使用注解为该文件命名的时候,该文件名字则为该类名。
* 如下:
* @file:JvmName("TLFAADemo")
* 使用注解将该文件类名编译为TLFAADemo
* */
fun topLevelFunction(): String = "this is a top level function"
/**
* 所谓顶层属性,可以看成是一个类外部属性成员,作为一些单独的数据片使用。
* val 修饰的作用说明是不可变的只能有get方法调出
* var 修饰的作用说明是可变的拥有get和set方法
* const 等价于 public static final的作用
* */
val authorName = "易庞宙"
var canSetValue = "zero"
const val resulut = "易庞宙 is already set"
其运行本质,Kotlin被研发到被开发人员钟爱并运用到开发的过程,其组织本着一种为JVM提供更好的编译这一理念。所以顶层函数运行最终也会编译成为字节码。所以其本质上只是在代码写法上简化了类包裹以及引用的写法而已,这也得益于Kotlin在编译期间做一些东西,使得我们这些开发人员能够使用更为简易可阅读的语言进行编写。
上述其顶层函数的代码的Kotlin字节码
// ================kotlin_demo/function/TLFAADemo.class =================
// class version 50.0 (50)
// access flags 0x31
public final class kotlin_demo/function/TLFAADemo {
@Lkotlin/jvm/JvmName;(name="TLFAADemo") // invisible
// access flags 0x19
public final static topLevelFunction()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 12 L0
LDC "this is a top level function"
ARETURN
L1
MAXSTACK = 1
MAXLOCALS = 0
// access flags 0x1A
private final static Ljava/lang/String; authorName = "易庞宙"
@Lorg/jetbrains/annotations/NotNull;() // invisible
// access flags 0x19
public final static getAuthorName()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 21 L0
GETSTATIC k