代理模式
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b
//在 Derived 的父类列表中的 by 从句会将 b 存储在 Derived 内部对象,并且编译器会生成 Base 的所有方法并转给 b
//函数定义关键字为fun 参数格式
public fun sum(a:Int,b:Int) :Int = a+b;
类代理:
Kotlin 在语法上支持代理 ,Derived 类可以继承 Base 接口并且指定一个对象代理它全部的公共方法:
//主函数使用
fun main(){
//使用代理类,执行操作类中的方法
Dev(BaseIm("代理")).show();
}
//事件模型
interface Base{
fun show()
}
//操作类
class BaseIm(str:String):Base{
var str: String?=null
init{
this.str=str
}
override fun show(){
print(this.str)
}
}
//代理类
class Dev(b:Base):Base by b
属性字段相关
val a: Int = 1
val b = 1 // 系统自动推断变量类型为Int
val c: Int // 如果不在声明时初始化则必须提供变量类型
c = 1 // 明确赋值
var x = 5 // 系统自动推断变量类型为Int
x += 1
//使用field关键字
public var fieldProp = ""
get() = field
set(value) {
field = value;
}
//不生成:
val isEmpty: Boolean
get() = this.size == 0
//生成:
val Foo.bar = 1
延迟初始化属性
public class MyTest {
lateinit var subject: TestSubject
@SetUp fun setup() {
subject = TestSubject()
}
@Test fun test() {
subject.method()
}
NULL检查机制
Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理返回值为 null或配合?:做空判断处理
//类型后面加?表示可为空
var age: String? = "23"
//抛出空指针异常
val ages = age!!.toInt()
//不做处理返回 null
val ages1 = age?.toInt()
//age为空返回-1
val ages2 = age?.toInt()