gpt4 book ai didi

Kotlin - var 与对象声明之间的区别

转载 作者:行者123 更新时间:2023-12-02 12:38:18 24 4
gpt4 key购买 nike

有什么区别

object Foo : Any() { ... }

val Foo = object : Any() { ... }

是否存在任何语义和/或逻辑差异,何时应使用它们?

最佳答案

  • object Foo : Any() { ... }

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

    class Bar {
    object Foo : Any() { ... } // only one object is created
    }

    对象声明通常用于封装全局单例状态和对相关公共(public)API成员进行分组。但是,由于 Foo 可以用作普通对象,因此有更多用例。其中之一是将 object 声明作为 sealed class 的子类型。 .

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

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

    class Bar {
    val foo = object : Any() { ... } // new object for each instance of Bar
    }

    当在顶层声明时,它仍然是一个单例,但它将在第一次访问文件外观类(它包含该文件的其他顶层成员)而不是 val< 时初始化

    当您以这种方式声明属性时,您将无法调用在属性的 object 范围内添加的成员,这与对象声明相反。但是,当用作局部变量时,这样的 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
    }

    此属性限制的目的是避免在匿名类(对象表达式被编译为)中使用公共(public) API,这可能会在下次编译时以不兼容的方式隐式更改。相反,对象声明声明一个命名类型。

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

    // 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
    })

注意:在这两种情况下,您都可以省略 : Any(),因为 Any 是对象声明和对象表达式的默认父类(super class)型。

关于Kotlin - var 与对象声明之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57700763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com