伴随对象相对于普通对象有什么优势?

科特林代码是这样的:

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静态函数,但是使用伴随对象还有其他的好处吗?

关键的区别之一是成员的知名度。 在同伴对象中,包含类的可见性是,如果成员是类的一部分,则不是原始对象的情况。

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

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