我对Kotlin还比较陌生,想知道在伴生对象中访问位于伴生对象之外的方法和变量是否可能,以及这是否违反最佳实践。
例如:
class A {
fun doStuff(): Boolean = return true
companion object{
public fun stuffDone(): Boolean = return doStuff()
}
}
或者类似于那样的东西
谢谢
我对Kotlin还比较陌生,想知道在伴生对象中访问位于伴生对象之外的方法和变量是否可能,以及这是否违反最佳实践。
例如:
class A {
fun doStuff(): Boolean = return true
companion object{
public fun stuffDone(): Boolean = return doStuff()
}
}
或者类似于那样的东西
谢谢
doStuff()
是一个类的实例方法;调用它需要一个类实例。伴生对象的成员,就像Java中的静态方法一样,在作用域内没有类实例。因此,要从伴生对象方法调用实例方法,需要显式提供一个实例:
class A {
fun doStuff() = true
companion object {
fun stuffDone(a: A) = a.doStuff()
}
}
private
修饰符即可。 - yole您还可以调用伴生对象块之外的函数。
class A {
fun doStuff() = true
companion object {
val a = A()
fun stuffDone() = a.doStuff()
}
}
做你想要的正确方法是:
为了更好地控制和更好的解耦级别,您应该从 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
}
}
doStuff
是在顶层定义还是在拥有伴生对象的类内部定义的? - marstran