Kotlin-变量与对象声明之间的差异

Kotlin-变量与对象声明之间的差异,kotlin,Kotlin,两者的区别是什么 object Foo : Any() { ... } 及 是否存在语义和/或逻辑上的差异,何时应使用这些差异? objectfoo:Any(){…} 这是一个,它声明了一个类似于单例的类型Foo,其单个实例包含在对象范围内声明的成员,并在首次访问时延迟初始化。它可以在顶层或其他类型中使用,但不能在功能体中使用。当在另一个类型中声明时,它仍然只会创建一个对象,而不是每个封闭类型的实例创建一个对象 class Bar { object Foo : Any() { ...

两者的区别是什么

object Foo : Any() { ... }

是否存在语义和/或逻辑上的差异,何时应使用这些差异?

  • objectfoo:Any(){…}

    这是一个,它声明了一个类似于单例的类型
    Foo
    ,其单个实例包含在
    对象
    范围内声明的成员,并在首次访问时延迟初始化。它可以在顶层或其他类型中使用,但不能在功能体中使用。当在另一个类型中声明时,它仍然只会创建一个对象,而不是每个封闭类型的实例创建一个对象

    class Bar {
        object Foo : Any() { ... } // only one object is created
    }
    
    对象声明通常用于封装全局单例状态并对相关的公共API成员进行分组。然而,由于
    Foo
    可以用作普通对象,因此有更多的用例。其中之一是将
    对象
    声明作为

  • val Foo=object:Any(){…}

    这是一个函数,也可以在函数体内使用。计算时,每次都会创建一个新对象。特别是,如果它是在另一个类型中声明的,它将为封闭类型的每个实例创建一个新对象

    class Bar {
        val foo = object : Any() { ... } // new object for each instance of Bar
    }
    
    当在顶级声明时,它仍然是一个单例,但它将在首次访问file facade类(包含该文件的其他顶级成员)而不是
    val
    时初始化

    当您以这种方式声明属性时,您将无法调用在属性的
    对象
    范围内添加的成员,而不是对象声明。但是,当用作局部变量时,这样的
    val
    将公开其其他成员

    // 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
    }
    
    对属性进行此限制的目的是避免在匿名类(对象表达式编译到匿名类)中使用公共API,这可能会在下次编译时以不兼容的方式隐式更改。相反,对象声明声明一个命名类型

    对象表达式和对象声明都可以从类继承并实现接口。当您需要提供一个不想用类实现的接口实例时(例如,它是一个在其他任何地方都不会使用的特殊实现),对象表达式尤其有用:

注意:在这两种情况下,都可以省略
: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
})