kotlin——从入门到放弃

ps:听了某个LOL王者五大神的建议,取了这个名字

简介:

我就不介绍了,看官网就行了。网址:http://kotlinlang.org/

本文主要记录从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的空判断无关线程安全,只是可以保证不会报错。其结果是不可确定的。





附件书籍:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章