当前位置: 首页 > 知识库问答 >
问题:

为什么我们在Kotlin中使用“同伴对象”作为Java静态字段的一种替换?

徐瀚
2023-03-14

“伴物”的本意是什么?到目前为止,我只是在需要时使用它来替换Java的静态

我困惑于:

    null
companion object {
    val singleton by lazy { ... }
}

共有1个答案

卢普松
2023-03-14

>

  • “伴物”的本意是什么?为什么叫“同伴”?

    首先,Kotlin没有使用static成员的Java概念,因为Kotlin有自己的object概念来描述与单例状态相关的属性和函数,而Javastatic部分可以用单例来优雅地表示:它是一个单例对象,可以用类的名称调用。因此命名:它是类附带的对象。

    它的名称以前是类对象缺省对象,但后来改名为companion object,这更清楚,也与Scala的companion objects一致。

    class MyClass {
        object IO {
            fun makeSomethingWithIO() { /* ... */ }
        }
    
        object Factory {
            fun createSomething() { /* ... */ }
        }
    }
    
    object Foo {
        val something by lazy { ... }
    }
    

    您还可能找到初始化单例状态的有用方法

  •  类似资料:
    • “伴生对象”的本意是什么?到目前为止,我使用它只是为了在需要时替换Java的。 null 这似乎是一种不正常的做法。有什么更好的办法?

    • 可以省略陪伴对象的名称,在这种情况下,将使用名称: 但是,我看到的示例中没有使用同伴对象的名称。 因为每个类只能有一个同伴对象(否则会得到错误),所以这个名称对我来说就像是一些非常没用的语法糖。

    • 问题内容: 我正在解决这个问题,有没有一种方法可以覆盖Java中的类变量? 第36条反对意见是: 如果您看到,请运行。 谁能解释为什么皱眉呢? 问题答案: 这是一个风格上的问题,而不是直接的问题。这表明您没有正确考虑班上正在发生的事情。 考虑一下什么意思: 此变量存在于类级别,在每个实例 中并不单独存在,并且在扩展me的类中没有独立存在 。 考虑一下什么意思: 该变量可以在此类,同一包中的 类以及

    • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则它可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

    • 我想了解将父对象引用设置为子对象的用例。示例:Dog类扩展了Animal类。(请注意,没有接口)我通常会创建一个Dog对象,如下所示: 现在,因为Dog是动物的一个子类,它已经可以访问动物的所有方法和变量。那么,这有什么区别: 请提供一个适当的用例及其使用的代码片段。请不要写关于“多态性”或“接口编码”的理论文章! 代码: 两种情况下的输出相同。那么为什么我们要将父引用设置为子对象呢?

    • 问题内容: 我越来越。我提到了这个问题,它解决了我的问题。第一个答案是 我的问题是为什么我们需要在同一个对象广告上进行同步? 据我的理解,当我们说 我们锁定了对象someObject,然后对其调用了wait()。 现在,另一个线程如何才能锁定同一对象以在其上调用notify()? 我想念什么? 问题答案: 为什么也需要锁? 想象一下这种情况: 现在想象一下其他地方没有任何锁定: 乍一看,整个声音总