Kotlin笔记 Object表达式和声明
2017-01-18 本文已影响6933人
yangweigbh
Object expression
类似java的匿名内部类
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ...
}
override fun mouseEntered(e: MouseEvent) {
// ...
}
})
如果父类的构造函数有参数,需要显示调用
open class A(x: Int) {
public open val y: Int = x
}
interface B {...}
val ab: A = object : A(1), B {
override val y = 15
}
如果不想继承任何父类,可以不写父类(应该是继承了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() = // ...
}
调用单例方法
DataProviderManager.registerDataProvider(...)
也可以继承父类
object DefaultListener : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ...
}
override fun mouseEntered(e: MouseEvent) {
// ...
}
}
object 声明不能放在函数中,但是可以放在其他object 声明中或者类声明中
Companion Objects
Companion Objects中定义的成员类似于Java中的静态成员,因为Kotlin中没有static成员
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
调用companion object的方法:
val instance = MyClass.create()
companion object的名字可以省略,可以使用Companion
来指代
class MyClass {
companion object {
}
}
val x = MyClass.Companion
虽然Companion object看起来像静态变量,但是在运行时是有创建Companion object实例的,比如可以实现接口。
interface Factory<T> {
fun create(): T
}
class MyClass {
companion object : Factory<MyClass> {
override fun create(): MyClass = MyClass()
}
}
可以使用@JvmStatic使Companion object的成员真正成为静态成员
- Object expression是马上执行的
- Object declaration是lazy的,在第一次使用时执行
- Companion Object是在类第一次加载时执行