ps:听了某个LOL王者五大神的建议,取了这个名字
简介:
本文主要记录从java转kotlin时遇到的问题,非学习使用。不过结尾会提供两个pdf版学习书籍给大家。好了,下面开始正文。
正文:
1. kotlin中的空判断(?)是怎么实现的?,是否线程安全?
答:这个空判断应该相当于java中的三目运算符(a == b ? a:b),但java中的三目元算符是非线程安全的(不符合原子性),在kotlin中是怎么实现的呢,这个需要查看class文件:
首先上一段java代码:
public class Test {
private final Object obj = null;
public void main() {
String a = obj == null ? "" : obj.toString();
}
}
相应的class指令:
Code:
stack=1, locals=2, args_size=1
0: aload_0
1: getfield #2 // Field obj:Ljava/lang/Object;
4: ifnonnull 12
7: ldc #3 // String
9: goto 19
12: aload_0
13: getfield #2 // Field obj:Ljava/lang/Object;
16: invokevirtual #4 // Method java/lang/Object.toStrin
)Ljava/lang/String;
19: astore_1
20: return
kotlin代码:
class Test {
private var obj: Any? = null
fun main() {
val a = obj?.toString()
}
}
对应的class文件:
Code:
stack=2, locals=2, args_size=1
0: aload_0
1: getfield #10 // Field obj:Ljava/lang/Object;
4: dup
5: ifnull 14
8: invokevirtual #14 // Method java/lang/Object.toStrin
:()Ljava/lang/String;
11: goto 16
14: pop
15: aconst_null
16: astore_1
17: return
对比发现kotlin的class文件 比 java的class文件 多了一个dup指令。
dup:复制栈顶的一个值,并将复制值重新压入栈顶
所以kotlin的空判断无关线程安全,只是可以保证不会报错。其结果是不可确定的。
附件书籍: