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

同伴对象与普通对象相比有什么优势?

路裕
2023-03-14

Kotlin代码是这样的:

class Foo {
  companion object {
     fun a() : Int = 1
  }
  fun b() = a() + 1
}

可以简单地更改为

object FooStatic {
   fun a() : Int = 1
}

class Foo {
  fun b() = FooStatic.a()
}

我知道同伴对象可以用来作为真正的java静态函数使用,但是使用同伴对象还有其他的优点吗?

共有1个答案

甘明朗
2023-03-14

其中一个关键区别是成员的可见性。在伴生对象中,包含类的可见性就像--如果成员是类的一部分--对于原始对象就不是这样。

下面的示例显示,您不能使用“对象”来实现类的私有静态内部。

package com.example

class Boo {

    companion object Boo_Core {
        // Public "static" call that non-Boo classes should not be able to call
        fun add_pub(a:Int) = a+1;

        // Internal "static" call that non-Boo classes should not be able to call
        private fun add_priv(a:Int) = a+1;
    }

    // OK: Functions in Boo can call the public members of the companion object
    fun blah_pub(a:Int) = add_pub(a)
    // OK: Functions in Boo can call the private members of the companion object
    fun blah_priv(a:Int) = add_priv(a)
}

//Same idea as the companion object, but as an "object" instead.
object Foo_Core {
    fun add_pub(a:Int) = a+1
    private fun add_priv(a:Int) = a+1;
}

class Foo {
    // OK Foo can get Foo_Cors add_pub
    fun blah_pub(a:Int) = Foo_Core.add_pub(a);

    // ERROR: can not get to add_priv
    // fun blah_priv(a:Int) = Foo_Core.add_priv(a);
}

class AnInterloper {

    // OK Other classes can use public entries in Foo.
    fun blah_foo_pub(a:Int) = Foo_Core.add_pub(a); 

    // ERROR Other classes can use public entries in Foo.
    // fun blah_foo_priv(a:Int) = Foo_Core.add_priv(a); 

    // OK: Other classes can use public Boo classes
    fun blah_boo_pub(a:Int) = Boo.add_pub(a);

    // ERROR: Other classes can not use private Boo classes
    // fun blah_boo_priv(a:Int) = Boo.add_priv(a);
}
 类似资料:
  • 在Kotlin中,如果我在同伴对象中有一个以作为前缀()的函数,那么与同伴对象中的相比会有什么不同呢? 我注意到,在下面的代码中,将使它对外部作用域不可见,但对同一同伴对象内部的函数仍然可见。 您可以在:https://pl.kotl.in/T6FVM6NI6找到代码片段 还有其他区别吗?和除了可见性之外是否相同?这是将方法封装在陪伴对象中的一种方法吗?

  • 两个 NavigableString 或 Tag 对象具有相同的HTML或XML结构时, Beautiful Soup就判断这两个对象相同. 这个例子中, 2个 <b> 标签在 BS 中是相同的, 尽管他们在文档树的不同位置, 但是具有相同的表象: “<b>pizza</b>” markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>"

  • 两个 NavigableString 或 Tag 对象具有相同的HTML或XML结构时, Beautiful Soup就判断这两个对象相同. 这个例子中, 2个 <b> 标签在 BS 中是相同的, 尽管他们在文档树的不同位置, 但是具有相同的表象: “<b>pizza</b>” markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>"

  • 我知道PriorityQueues的迭代器没有返回正确的顺序,因此我查看顺序的能力受到限制--但是我可以看到元素离开队列的顺序,而且它显然没有按照我希望的路径运行。 建议?

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

  • 问题内容: 我得到的错误就在这行 。 该怎么办?其他逻辑还可以吗? 我想做的是有一个A列表和一个B列表,其中一个属性与id相同;尽管变量名不同。即在和在B。现在我将两个列表都放在ListAll中,并在相同的变量id / bid上对它们进行排序。我有A和B实现可比性。 和我的listAll是对象类型? 我该怎么做?谢谢。 问题答案: 您可以添加一个通用基类并在那里进行比较,如下所示: