Kotlin-变量与对象声明之间的差异
两者的区别是什么Kotlin-变量与对象声明之间的差异,kotlin,Kotlin,两者的区别是什么 object Foo : Any() { ... } 及 是否存在语义和/或逻辑上的差异,何时应使用这些差异? objectfoo:Any(){…} 这是一个,它声明了一个类似于单例的类型Foo,其单个实例包含在对象范围内声明的成员,并在首次访问时延迟初始化。它可以在顶层或其他类型中使用,但不能在功能体中使用。当在另一个类型中声明时,它仍然只会创建一个对象,而不是每个封闭类型的实例创建一个对象 class Bar { object Foo : Any() { ...
object Foo : Any() { ... }
及
是否存在语义和/或逻辑上的差异,何时应使用这些差异?
这是一个,它声明了一个类似于单例的类型objectfoo:Any(){…}
,其单个实例包含在Foo
范围内声明的成员,并在首次访问时延迟初始化。它可以在顶层或其他类型中使用,但不能在功能体中使用。当在另一个类型中声明时,它仍然只会创建一个对象,而不是每个封闭类型的实例创建一个对象对象
对象声明通常用于封装全局单例状态并对相关的公共API成员进行分组。然而,由于class Bar { object Foo : Any() { ... } // only one object is created }
可以用作普通对象,因此有更多的用例。其中之一是将Foo
声明作为对象
这是一个函数,也可以在函数体内使用。计算时,每次都会创建一个新对象。特别是,如果它是在另一个类型中声明的,它将为封闭类型的每个实例创建一个新对象val Foo=object:Any(){…}
当在顶级声明时,它仍然是一个单例,但它将在首次访问file facade类(包含该文件的其他顶级成员)而不是class Bar { val foo = object : Any() { ... } // new object for each instance of Bar }
时初始化 当您以这种方式声明属性时,您将无法调用在属性的val
范围内添加的成员,而不是对象声明。但是,当用作局部变量时,这样的对象
将公开其其他成员val
对属性进行此限制的目的是避免在匿名类(对象表达式编译到匿名类)中使用公共API,这可能会在下次编译时以不兼容的方式隐式更改。相反,对象声明声明一个命名类型 对象表达式和对象声明都可以从类继承并实现接口。当您需要提供一个不想用类实现的接口实例时(例如,它是一个在其他任何地方都不会使用的特殊实现),对象表达式尤其有用:// on top level: val foo = object : Any() { val x = 1 } fun main() { println(foo.x) // error, unresolved reference 'x' val bar = object : Any() { val x = 1 } println(bar.x) // OK }
:Any()
,因为Any
是对象声明和对象表达式的默认超类型
// on top level:
val foo = object : Any() {
val x = 1
}
fun main() {
println(foo.x) // error, unresolved reference 'x'
val bar = object : Any() {
val x = 1
}
println(bar.x) // OK
}
// in a library:
interface ResponseHandler {
fun onSuccess(response: Response): Unit
fun onError(exception: Exception): Unit
}
fun Request.execute(responseHandler: ResponseHandler) { ... }
// your code:
val request: Request = ...
request.execute(object : ResponseHandler {
fun onSuccess(response: Response) { ... } // provide the implementations
fun onError(exception: Exception) { ... } // for these two functions
})