在本文中,您将在示例的帮助下了解对象声明(单例)和对象表达式。
单例是一种面向对象的模式,其中一个类只能有一个实例(对象)。
例如,您正在开发一个具有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
对象声明可以像普通类一样从类和接口继承。
对象声明有时会很有用。但是,它们在与系统许多其他部分交互的大型软件系统中并不理想。
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) { // ... } }
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 吃东西。 与人交谈。 我不祈祷。 我是一个无神论者。