Java 使用companion对象返回Kotlin中类的实例

Java 使用companion对象返回Kotlin中类的实例,java,android,kotlin,Java,Android,Kotlin,我正在创建一个Android应用程序,我想返回扩展应用程序的类的实例,并访问Java中使用静态应用程序所做的等效操作 Android Studio 3.0 RC2 Kolin 1.1.51 我是这样访问它的。但是,getCacheDir返回null class BusbyMoviesMainApplication : Application() { companion object { private val instance: BusbyMoviesMainAppli

我正在创建一个Android应用程序,我想返回扩展应用程序的类的实例,并访问Java中使用静态应用程序所做的等效操作

Android Studio 3.0 RC2
Kolin 1.1.51
我是这样访问它的。但是,getCacheDir返回null

class BusbyMoviesMainApplication : Application() {
    companion object {
        private val instance: BusbyMoviesMainApplication = BusbyMoviesMainApplication()

        @JvmStatic
        fun getBusbyInstance(): BusbyMoviesMainApplication {
            return instance
        }
    }
}
我看不出我做错了什么

在Java中,我以前也做过类似的工作,我正在Kotlin中尝试做同样的工作:

BusbyMoviesMainApplication.getBusbyInstance().getCacheDir()

在Kotlin代码中,您直接调用
应用程序
子类的构造函数,而不是让框架为您创建它。您可以改为执行Java代码中的操作,并在
应用程序的
onCreate
方法中初始化
实例
属性(另外,我将getter缩短了一点):


根据下面评论中的讨论,对于getter来说,这可能是一个更惯用的解决方案:

class BusbyMoviesMainApplication : Application() {
    companion object {
        private lateinit var instance: BusbyMoviesMainApplication

        @JvmStatic
        fun getBusbyInstance() = instance
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
    }
}

为什么要显式生成setter而不是让kotlin为您生成它?这是维护Java兼容性并让Java代码以
BusbyMoviesMainApplication.getBusbyInstance()的形式访问实例的最简单方法。我假设这是问题中的
@JvmStatic
所要求的。当然,如果您只使用Kotlin,您可以将
实例
属性设置为公共并除去getter,然后作为
BusbyMoviesMain应用程序访问它。实例
。Kotlin无论如何都会生成getter。对于java interop,您可以将其公开并添加
@JvmStatic
注释以获取
getInstance()
方法您是对的,我之所以避免这样做,是因为它还将生成一个setter,因为
lateinit
属性始终必须是
var
才能分配的。我刚刚意识到这可以通过
private set
来解决。我马上编辑答案。
class BusbyMoviesMainApplication : Application() {
    companion object {
        private lateinit var instance: BusbyMoviesMainApplication

        @JvmStatic
        fun getBusbyInstance() = instance
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
    }
}
class BusbyMoviesMainApplication : Application() {
    companion object {
        @JvmStatic
        lateinit var instance: BusbyMoviesMainApplication
            private set
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
    }
}