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

Posted

技术标签:

【中文标题】伴随对象相对于普通对象有啥优势?【英文标题】:What are the advantages of a companion object over a plain object?伴随对象相对于普通对象有什么优势? 【发布时间】:2018-04-13 06:37:05 【问题描述】:

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 静态函数,但是使用伴生对象还有其他优点吗?

【问题讨论】:

这个问题实际上只是在另一个答案 (***.com/a/40352734/221955) 中回复评论的地方,我的回复不合适且太长而无法作为评论留下。 【参考方案1】:

主要区别之一是成员的可见性。 在伴随对象中,包含类的可见性就像成员是类的一部分一样 - 对于原始对象而言并非如此。

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

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

【讨论】:

太棒了。非常感谢您的解释。

以上是关于伴随对象相对于普通对象有啥优势?的主要内容,如果未能解决你的问题,请参考以下文章

(有没有)python socketserver 相对于常规套接字对象的性能优势?

Go 语言中的通用类型(int / uint)相对于特定类型(int64 / uint64)有啥优势?

ListFragment 相对于 ListView 或普通 Fragment 的优势

JS面向对象到底有啥用?面向对象里函数的写法和普通函数写法有啥区别?都有哪些优势?

小程序相对APP有啥优势?

java中用父路径和子路径创建file对象有啥用呢