Kotlin 对象声明和表达式

在本文中,您将在示例的帮助下了解对象声明(单例)和对象表达式。

对象声明

单例是一种面向对象的模式,其中一个类只能有一个实例(对象)。
例如,您正在开发一个具有SQL数据库后端的应用程序。 您想创建一个连接池来访问数据库,同时为所有客户端重用相同的连接。 为此,您可以通过单例类创建连接,以便每个客户端获得相同的连接。

Kotlin提供了一种使用对象声明特性创建单例的简单方法。为此,使用 object 关键字。

object SingletonExample {
    ... .. ...
    //类主体
    ... .. ...
}

上面的代码结合了一个类声明和该类的单个实例 SingletonExample 的声明

对象声明可以包含属性、方法等。 但是,它们不允许有构造函数(这是有道理的)。

与普通类的对象相似,您可以使用 . 符号来调用方法和访问属性。

示例:对象声明

object Test {
    private var a: Int = 0
    var b: Int = 1

    fun makeMe12(): Int {
        a = 12
        return a
    }
}

fun main(args: Array<String>) {
    val result: Int

    result = Test.makeMe12()

    println("b = ${Test.b}")
    println("result = $result")
}

运行该程序时,输出为:

b = 1
result = 12

对象声明可以像普通类一样从类和接口继承。

单例 和 依赖注入

对象声明有时会很有用。但是,它们在与系统许多其他部分交互的大型软件系统中并不理想。

Kotlin 对象表达式

object关键字还可用于创建匿名类的对象,称为匿名对象。如果需要创建对某个类或接口稍加修改的对象,而不必为其声明子类,则可以使用它们。例如,

window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }

    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
})

在这里,声明了一个扩展MouseAdapter类的匿名对象。该程序重写了两个MouseAdapter方法:mouseClicked()和mouseEntered()。

如有必要,可以为匿名对象分配名称,并将其存储在变量中。 例如:

val obj = object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }

    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
}

示例:Kotlin 对象表达式

open class Person() {
    fun eat() = println("吃东西。")
    fun talk() = println("与人交谈。")
    open fun pray() = println("向上帝祈祷。")
}

fun main(args: Array<String>) {
    val atheist = object : Person() {
        override fun pray() = println("我不祈祷。 我是一个无神论者。")
    }

    atheist.eat()
    atheist.talk()
    atheist.pray()
}

运行该程序时,输出为:

吃东西。
与人交谈。
我不祈祷。 我是一个无神论者。

这里,匿名对象存储在变量atheist中,该变量实现Person类,pray()方法被重写。

如果实现的类具有声明匿名对象的构造函数,则需要传递适当的构造函数参数。例如,

open class Person(name: String, age: Int) {

    init {
        println("name: $name, age: $age")
    }

    fun eat() = println("吃东西。")
    fun talk() = println("与人交谈。")
    open fun pray() = println("向上帝祈祷。")
}

fun main(args: Array<String>) {
    val atheist = object : Person("Jack", 29) {
        override fun pray() = println("我不祈祷。 我是一个无神论者。")
    }

    atheist.eat()
    atheist.talk()
    atheist.pray()
}

运行该程序时,输出为:

name: Jack, age: 29
吃东西。
与人交谈。
我不祈祷。 我是一个无神论者。