阅读 162

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吃东西。
与人交谈。
我不祈祷。 我是一个无神论者。


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐