Kotlin笔记 Object表达式和声明

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
        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 {
    fun create(): T
}


class MyClass {
    companion object : Factory {
        override fun create(): MyClass = MyClass()
    }
}

可以使用@JvmStatic使Companion object的成员真正成为静态成员

  • Object expression是马上执行的
  • Object declaration是lazy的,在第一次使用时执行
  • Companion Object是在类第一次加载时执行

你可能感兴趣的:(Kotlin笔记 Object表达式和声明)