private int anInt = 0;
public int getAnInt() {
return anInt;
}
public void setAnInt(int anInt) {
this.anInt = anInt;
}
}
下面是Kotlin代码
val javaClass = JavaClass()
javaClass.anInt = 5
print(javaClass.anInt)
所以我们在Android开发时,就可以这样:
view.background = ...
textView.text = ...
反过来在Java中调用Kotlin也毫无压力,官方文档Calling Kotlin from Java对于常见的情况作了比较详细的阐述,这里就不再
赘述。
3、简洁,可靠,有趣、简洁,可靠,有趣
3.1 数据类数据类
最初学Java的时候,学到一个概念叫JavaBean,当时就要被这个概念给折磨死了。明明很简单的一个东西,结果搞得很复杂
的样子,而且由于当时对于这些数据类的设计概念不是很清晰,因而也并不懂得去覆写诸如equals和hashcode这样重要的方
法,一旦用到HashMap这样的集合框架,总是出了问题都不知道找谁。
Kotlin提供了一种非常简单的方式来创建这样的数据类,例如:
data class Coordinate(val x: Double, val y: Double)
仅仅一行代码,Kotlin就会创建出一个完整的数据类,并自动生成相应的equals、hashcode、toString方法。是不是早就受够
了getter和setter?反正我是受够了。
3.2 空安全与属性代理空安全与属性代理
第一次见到空类型安全的设计是在Swift当中,那时候还觉得这个东西有点儿意思哈,一旦要求变量不能为空以后,因它而导
致的空指针异常的可能性就直接没有了。想想每次QA提的bug吧,说少了都得有三分之一是空指针吧。
Kotlin的空安全设计,主要是在类型后面加?表示可空,否则就不能为null。
val anInt: Int = null // 错误
val anotherInt: Int? = null // 正确
使用时,则:
val nullable: Int? = 0
val nonNullable: Int = 2
nullable.toFloat() // 编译错误
nullable?.toFloat() // 如果null,什么都不做,否则调用toFloat
nullable!!.toFloat() // 强制转换为非空对象,并调用toFloat;如果nullable为null,抛空指针异常
nonNullable.toFloat() // 正确
而对于Java代码,比如我们在覆写Activity的onCreate方法时,有个参数savedInstanceState:
override fun onCreate(savedInstanceState: Bundle!)
这表示编译器不再强制savedInstanceState是否可null,开发者在覆写时可以自己决定是否可null。当然,对于本例,onCreate
的参数是可能为null的,因此覆写以后的方法应为:
override fun onCreate(savedInstanceState: Bundle?)
通常来讲,教科书式的讲法,到这里就该结束了。然而直到我真正用Kotlin开始写代码时,发现,有些需求实现起来真的有些
奇怪。