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

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

端木昱
2023-03-14

“伴生对象”的本意是什么?到目前为止,我使用它只是为了在需要时替换Java的static

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

这似乎是一种不正常的做法。有什么更好的办法?

共有1个答案

高化
2023-03-14

>

  • “伴侣对象”的本意是什么?为什么叫“伴侣”?

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

    它的名称以前是类对象默认对象,但后来它被重命名为伙伴对象,这更加清晰,也与Scala伙伴对象一致。

    除了命名之外,它比Java静态成员更强大:它可以扩展类和接口,您可以像其他对象一样引用并四处传递它。

    这是否意味着要创建多个静态属性,我必须在companion object块中将其分组在一起?

    是的,那是惯用的方式。或者您甚至可以根据它们的含义将它们分组到非伴生对象中:

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

    您还可以删除lazy{...}委派,以使属性在first Class的使用时初始化,就像Java静态初始化器一样

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

  •  类似资料:
    • “伴物”的本意是什么?到目前为止,我只是在需要时使用它来替换Java的。 我困惑于: null

    • 我试图在其他类中调用一个类的静态函数,但在kotlin中我不能创建一个静态函数,我必须创建一个伴生对象,在其中我必须定义我的函数,但在这样做的时候我不能访问父类变量,有什么方法可以在kotlin中实现这一点。 我想访问有趣的returnString()类的静态函数,就像我们在java中做的一样,如果有谁已经实现了这一点,请帮助。

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

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

    • 我在问一个很简单的问题,但我有点困惑。 假设我有一个类: 并具有另一个类: 最后是我的Main.java类 如果我将子对象创建为 则对象可以访问变量。 我的问题是: 仅提供父类的变量的访问权限。那么这条线的确切用途是什么?? 并且当它使用动态多态性时,那么为什么在这样做之后,child类的变量是不可访问的