Object expression
類似java的匿名內(nèi)部類
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ...
}
override fun mouseEntered(e: MouseEvent) {
// ...
}
})
如果父類的構(gòu)造函數(shù)有參數(shù),需要顯示調(diào)用
open class A(x: Int) {
public open val y: Int = x
}
interface B {...}
val ab: A = object : A(1), B {
override val y = 15
}
如果不想繼承任何父類赚楚,可以不寫父類(應(yīng)該是繼承了Any)
val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)
object可以訪問外圍作用域的變量
fun countClicks(window: JComponent) {
var clickCount = 0
var enterCount = 0
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
clickCount++
}
override fun mouseEntered(e: MouseEvent) {
enterCount++
}
})
// ...
}
Object 聲明
Object 聲明用來定義單例
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ...
}
val allDataProviders: Collection<DataProvider>
get() = // ...
}
調(diào)用單例方法
DataProviderManager.registerDataProvider(...)
也可以繼承父類
object DefaultListener : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ...
}
override fun mouseEntered(e: MouseEvent) {
// ...
}
}
object 聲明不能放在函數(shù)中爷怀,但是可以放在其他object 聲明中或者類聲明中
Companion Objects
Companion Objects中定義的成員類似于Java中的靜態(tài)成員,因為Kotlin中沒有static成員
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
調(diào)用companion object的方法:
val instance = MyClass.create()
companion object的名字可以省略,可以使用Companion
來指代
class MyClass {
companion object {
}
}
val x = MyClass.Companion
雖然Companion object看起來像靜態(tài)變量蝴蜓,但是在運行時是有創(chuàng)建Companion object實例的,比如可以實現(xiàn)接口俺猿。
interface Factory<T> {
fun create(): T
}
class MyClass {
companion object : Factory<MyClass> {
override fun create(): MyClass = MyClass()
}
}
可以使用@JvmStatic使Companion object的成員真正成為靜態(tài)成員
- Object expression是馬上執(zhí)行的
- Object declaration是lazy的茎匠,在第一次使用時執(zhí)行
- Companion Object是在類第一次加載時執(zhí)行