在 Kotlin 中如何访问伴生对象之外的方法?

21

我对Kotlin还比较陌生,想知道在伴生对象中访问位于伴生对象之外的方法和变量是否可能,以及这是否违反最佳实践。

例如:

class A {
    fun doStuff(): Boolean = return true

    companion object{
        public fun stuffDone(): Boolean = return doStuff()
    }
}

或者类似于那样的东西

谢谢


doStuff 是在顶层定义还是在拥有伴生对象的类内部定义的? - marstran
3个回答

40

doStuff() 是一个类的实例方法;调用它需要一个类实例。伴生对象的成员,就像Java中的静态方法一样,在作用域内没有类实例。因此,要从伴生对象方法调用实例方法,需要显式提供一个实例:

class A {
    fun doStuff() = true

    companion object {
        fun stuffDone(a: A) = a.doStuff() 
    }
}

1
谢谢,如果我想以静态方式访问它,我可以将doStuff()放在伴生对象中。但那会使它变成公共的,对吗? - alessandro gaboardi
1
是的,你可以这样做。在 Kotlin 中,所有成员默认都是公共的,无论你是在类中定义还是在伴生对象中定义。如果你不想让它是公共的,只需添加 private 修饰符即可。 - yole

2

您还可以调用伴生对象块之外的函数。

class A {
    fun doStuff() = true

    companion object {
        val a = A()
        fun stuffDone() = a.doStuff() 
    }
}

这是访问的推荐方式吗? - K Pradeep Kumar Reddy
你可以创建静态类变量/对象。 - Navinpd

0

做你想要的正确方法是:

  1. 在 Companion Objects 中创建主类的实例
  2. 在实例化 Main Class 时初始化该实例
  3. 需要调用方法、设置或获取变量时,调用类的实例。

为了更好地控制和更好的解耦级别,您应该从 Companion Object 访问/设置/获取主类(A)的内容,而不是调用 getInstance() 来访问 Main Class 的内容。

例如:

 class A {
        
        private val myPrivateVariable:String = "MY_STUFF"
       
        init{
            setupInstance(this@A)
        }
        
        companion object{
           private val instance:A? = null
           
           fun setupInstance(a:A){
               this.instance = a
           }
           
           //IF YOU WANT TO ACCESS CLASS A METHODS/VARIABLES DIRECTLY YOU CAN CALL IT
           fun getInstance():A{
               return this.instance?.let{
                   it
                   }?:throw NullPointerException("INSTANCE NOT SET YET")
           }
           
           //ACCESSING CLASS A VARIABLES FROM COMPANION OBJECT (BETTER ERROR CONTROL AND DECOUPLED)
           fun setMyVariable(string:String){
               this.getInstance().myPrivateVariable = string
           }
            
            fun getMyVariable(string:String) = this.getInstance().myPrivateVariable    
          
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接