📜  Kotlin对象声明和表达式

📅  最后修改于: 2020-10-05 14:54:17             🧑  作者: Mango

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

对象声明

单例是一种面向对象的模式,其中一个类只能有一个实例(对象)。

例如,您正在开发一个具有SQL数据库后端的应用程序。您想创建一个连接池来访问数据库,同时为所有客户端重用相同的连接。为此,您可以通过单例类创建连接,以便每个客户端获得相同的连接。


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

object SingletonExample {
    ... .. ...
    // body of class
    ... .. ...
}

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

对象声明可以包含属性,方法等。但是,不允许它们具有构造函数(这很有意义)。 为什么?

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


示例:对象声明

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

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

fun main(args: Array) {
    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) {
        // ...
    }
})

(该示例摘自Kotlin官方文档页面。)

在这里,声明了一个扩展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("Eating food.")

    fun talk() = println("Talking with people.")

    open fun pray() = println("Praying god.")
}

fun main(args: Array) {
    val atheist = object : Person() {
        override fun pray() = println("I don't pray. I am an atheist.")
    }

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

运行该程序时,输出为:

Eating food.
Talking with people.
I don't pray. I am an atheist.

在这里,匿名对象存储在无神论者变量中,该无神论者使用pray()方法实现了Person类。


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

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

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

    fun eat() = println("Eating food.")
    fun talk() = println("Talking with people.")
    open fun pray() = println("Praying god.")
}

fun main(args: Array) {
    val atheist = object : Person("Jack", 29) {
        override fun pray() = println("I don't pray. I am an atheist.")
    }

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

运行该程序时,输出为:

name: Jack, age: 29
Eating food.
Talking with people.
I don't pray. I am an atheist.