在昨天和做android的前輩一番交談后,覺得很慚愧,許多東西還只是知其然而不知其所以然,也深感自己的技術還太淺薄。以后要更加努力地學習,要著重學習原理、方法論,不能只停留在會用的階段。
今天又要獻丑分享一些關于使用Kotlin這門新興的編程語言的一些要注意的地方。因為上一個項目全部使用了kotlin,算是給后面接手的朋友的一份交接文檔吧。
先推薦三篇文章吧:
Kotlin for android developers、為什么說Kotlin值得一試、Kotlin: Java 6 廢土中的一線希望
這三篇文章都是我反復閱讀參考很多遍的關于kotlin使用的中文教程,當然,有時候遇到了中文教程里講的不清楚,或者是感覺翻譯不太對胃口的,可以直接去查閱官方文檔。
遇到問題請善用資料,基本上都能從中得到解答。以下簡單介紹一下常見的幾個注意點。
變量類型:可空
kotlin的特性之一是類型安全。定義變量時需要定義該變量是否為空,一旦要求變量不能為空,那后續的空指針問題自然也不復存在。我們先來看kotiln里是如何定義變量的:
java:
String str = "test";
final String str2 = "test2";
String str3;
kotlin:
var str = "test"
val str2 = "test2"
var str3:String ?= null
kotlin使用var,val關鍵字定義變量,如果在定義變量時直接賦值,則可以不用指定變量類型,否則需要在變量名后使用“:”來指定類型。在類型后加“?”表示該變量可空。如果變量可空,那在后續使用變量時,就必須先判斷是否為空。
另外從代碼中可以看出很重要的一點,那就是:從此再也不用寫分號啦
var a:Int = null //錯誤,類型后沒?,即不可空類型,自然不能等于null
var a:Int? = null //正確
val canNull: Int ? = 0
canNull.toFloat //錯誤,可空變量調用時要判斷空
canNull?.toFloat //正確,(如果是null,什么都不做)
canNull!!.Float //正確,(如果null,報空指針)
val canNotNull: Int = 0
canNotNull.toFloat //正確
那如果在定義變量時(例如定義成員變量),又想該變量不為空,又不想子定義時就初始化要怎么辦呢?使用lateinit關鍵字
lateinit var test:String //正確
lateinit val test:String //錯誤
lateinit var test:Float //錯誤
關于lateinit關鍵字的使用限制:
lateinit modifier is allowed only on mutable properties
lateinit modifier is not allowed on primitive type properties
可見,lateinit修飾符只能修飾不可空類型,并且不允許修飾基礎類型(四類八種基礎類型int, double,boolean等)。
常用語法:
switch
java:
int test = 1;
switch(test) {
case 1:
...
break;
default:
break;
}
kotlin:
when (test) {
1 -> fragment = ShopFragment()
else -> {
}
}
這只是when最簡單的用法,但kotlin里when的用處要比switch強大得多,when可以返回值,甚至可以在匹配條件里檢測參數類型等,例如:
val result = when (x) { //返回值
0, 1 -> "test"
else -> "else"
}
when(view) { //檢測參數類型,并且可見,在kotlin里,instanceof使用is代替
is TextView -> view.setText("I'm a TextView")
else -> view.visibility = View.GONE
}
var test = 3
when(view) { //檢測參數范圍
in 0..10 -> {
...
}
else -> {
...
}
更多用法詳見教程。
for循環
java:
for(int i =0; i < 5; i++) {
}
kotlin:
for(i in 0..4) {
}
for (item in listData) { //遍歷列表,直接操作列表內的對象
item.method()
}
for (i in listData.indices) { //遍歷列表帶行index
}
for((i, item) in list.witnIndex()) { //加強版
}
listData.forEach { it.method() } //變種的for循環