Kotlin簡介
Kotlin是一種針對Java 平臺的新編程語言。Kotlin簡潔、安全、務實,并且專注于與Java代碼的互操作性。它幾乎可以用在現(xiàn)在Java使用的任何地方:服務端開發(fā)、Android應用等等。Kotlin 可以很好地和所有現(xiàn)存的Java庫和框架一起工作,而且性能和Java旗鼓相當。
- Kotlin 是靜態(tài)類型語言并支持類型推導,允許維護正確性與性能的同時保持源代碼的簡潔。
- Kotlin 支持面向對象和函數(shù)式兩種編程風格,兩種風格可以隨意混合使用,通過頭等函數(shù)使更高級別的的抽象成為可能。
- 與Java可互操作,這樣可以使學習曲線更平滑,項目新語言更新曲線更平滑。
- Kotlin 是務實的、安全的、簡潔的。
被詬病的java空指針
在java問世的時候宣傳的一大亮點就是摒棄掉了C語言的指針,了解java的小伙伴都知道java的內(nèi)存數(shù)據(jù)結構中,對象存放在堆中而引用存放在棧中,想要獲取到對象實體,必須通過引用指向實際的對象內(nèi)存地址,如果這條聯(lián)系不在了,那么就會報空指針異常NullPointerException。
kotlin解決了這個問題,不能說是解決,而是有效的限制了這種問題的出現(xiàn)。
- 可用類型(?)新增的一種數(shù)據(jù)類型,例如:
var value1 : String? = null //是合法的
var value2 : String = null //是不合法的,編譯不過的
kotlin編譯器認為value2是不可空的String類型,所以初始化和以后的賦值中不能為null,所以一個方法的參數(shù)是String類型,如果傳入值可能為null,編譯器會報錯,警告你要傳入不可為空的參數(shù)。另外:如果和java代碼混編的話,可能不會報錯,所以還是要注意。
- 安全調(diào)用運算符(?.)
這個運算符就厲害了,當你的變量的類型是可空類型,那么在調(diào)用內(nèi)部屬性或者方法的時候,必須使用?.運算符,例如:
value1?.length()
這條語句的含義是value1如果為空,則不執(zhí)行。如果是java代碼,會怎么做?
if(value1 != null){
value1.length()
}
代碼中不可能所有的對象都要這樣去判空一下,那太令人作嘔了。有經(jīng)驗的程序員會知道代碼執(zhí)行到這里的時候該對象是否可能為空。但是,上了一些代碼異常跟蹤平臺,比方說bugly,你會發(fā)現(xiàn)線上版本在用戶手里運行的時候能出現(xiàn)好多無厘頭的空指針,完全顛覆你的自信心,所以kotlin真香。
能省則省,要的就是簡潔
舉例說明一下封裝類的創(chuàng)建代碼,java代碼
public class Person{
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
kotlin代碼
data class Person(var name: String, var age: Int)
至于get、set方法kotlin代碼在編譯階段幫你生成,調(diào)用時也不需要get、set,直接對象打點調(diào)用屬性名稱。
高階函數(shù),回調(diào)接口不再是必需品
java代碼想要創(chuàng)造一個回調(diào)函數(shù),需要創(chuàng)建一個接口:
public interface OnClickListener{
void onClick();
}
需要一個管理類:
public class ListenerManager{
private OnClickListener mOnClickListener;
public void setOnClickListener(OnClickListener onClickListener){
this.mOnClickListener = onClickListener;
}
public OnClickListener getOnClickListener(){
return mOnClickListener;
}
}
需要一個實現(xiàn)類:
public class MyOnClickListener implement OnClickListener{
@Override
public void onClick(){
// 回調(diào)函數(shù)中處理邏輯
}
}
然后在自己的業(yè)務場景中創(chuàng)建MyOnClickListener對象,調(diào)用onClick方法,或者通過參數(shù)的形式進行異步邏輯實現(xiàn)。
public void getServerData(MyOnClickListener listener){
// 獲取到數(shù)據(jù)之后調(diào)用
listener.onClick();
}
obj.getServerData(new MyOnClickListener(){
@Override
public void onClick(){
// 回調(diào)函數(shù)中處理邏輯
}
})
然而用kotlin的高階函數(shù)可以這么寫:
public fun getServerData(listener: ()-> Unit){
// 獲取到數(shù)據(jù)之后調(diào)用
listener.invoke()
}
obj.getServerData {
// 高階函數(shù)中處理邏輯
}
相比較java代碼而言省去了接口的創(chuàng)建,管理接口對象的管理類的創(chuàng)建,變得很簡單易用。等等