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的空判斷無關線程安全,只是可以保證不會報錯。其結果是不可確定的。





附件書籍:





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