-
簡(jiǎn)潔性
這里我以最簡(jiǎn)單的POJO為例
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
這是我用Java寫的一個(gè)POJO徙垫,定義了一個(gè)user類,有兩個(gè)屬性name放棒、age,那么用Kotlin是怎么寫的呢己英?如下:
class User {
var name: String? = null
var age: Int = 0
}
Kotlin會(huì)自動(dòng)生成所有的屬性和它們的訪問(wèn)器间螟,下列是帶參數(shù)的構(gòu)造器書寫
class User {
var name: String? = null
var age: Int = 0
constructor(name:String){
this.name=name
}
constructor(name:String,age:Int){
this.name=name
this.age=age
}
}
那么如何創(chuàng)建一個(gè)user對(duì)象呢?如下:
var myuser=User("tracy",18)
對(duì)比一下Java和Kotlin的編程损肛,Kotlin代碼的簡(jiǎn)潔性顯而易見(jiàn)厢破。
-
空安全
當(dāng)我們用Java寫代碼時(shí),我們?nèi)绻幌氤霈F(xiàn)NullPointerException治拿,我們需要在使用它之前每次去判斷是否為空摩泪。而Kotlin這類空安全語(yǔ)言默認(rèn)對(duì)象和字段不能為空,如果我們非要讓一個(gè)字段或?qū)ο鬄榭漳敲幢仨毷褂冒踩{(diào)用操作符(劫谅?)來(lái)指定见坑。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val user : User?= null
toast(user.name)
}
fun toast(text:String?){
Toast.makeText(this,text,Toast.LENGTH_SHORT)
}
這樣直接調(diào)用是會(huì)編譯報(bào)錯(cuò)的嚷掠,因?yàn)閡ser可能為空,下列有兩種方法可以處理
方法一:直接加個(gè)非空判斷
var user : User?= null
if(user != null){
toast(user.name)
}
方法二:使用安全符(荞驴?)
var user: User? = null
toast (user?.name)
當(dāng)user值為空時(shí)不皆,我們還可以設(shè)置個(gè)默認(rèn)值
var user: User? = null
toast (user?.name?:"tracy")
-
易擴(kuò)展性
Kotlin允許我們對(duì)任何類添加方法,包括系統(tǒng)級(jí)的類熊楼,自定義類等等霹娄,比如我想在Context類中添加一個(gè)toast方法。
var contxt:Context?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
contxt=this.contxt;
contxt?.toast("my name is kotlin")
}
fun Context.toast(message:String){
Toast.makeText(this,message,Toast.LENGTH_SHORT)
}
這樣所有使用 Context的地方都可以直接調(diào)用context.toast鲫骗,如果擴(kuò)展方法只寫到當(dāng)前類中犬耻,那么只在當(dāng)前類生效
-
函數(shù)式(Lambdas)
我這里以常用到的點(diǎn)擊事件為例
private View tv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=findViewById(R.id.tv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(JMainActivity.this,"hello world",Toast.LENGTH_SHORT);
}
});
}
如果用Kotlin編程,那么只需要一行代碼即可解決
private var tv: View? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv = findViewById(R.id.tv)
tv?.setOnClickListener({tv -> toast("Click")})
}
fun Context.toast(message:String){
Toast.makeText(this,message, Toast.LENGTH_SHORT)
}
有些時(shí)候我們并不需要用到tv參數(shù)
tv?.setOnClickListener{toast("Click")}
-
Kotlin Android Extention
相信我們?cè)缫呀?jīng)厭煩了些一堆的findViewById這樣的代碼执泰,使用Kotlin我們可以直接用id綁定
首先應(yīng)該導(dǎo)入布局枕磁,導(dǎo)入格式為import kotlinx.android.synthetic.main.<layout> .*
import kotlinx.android.synthetic.main.activity_main.*
class JMainActivity internal constructor() : Activity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv?.setText("hello world");
tv?.setOnClickListener{toast("Click")}
}
fun Context.toast(message:String){
Toast.makeText(this,message, Toast.LENGTH_SHORT)
}