Java 使用companion对象返回Kotlin中类的实例
我正在创建一个Android应用程序,我想返回扩展应用程序的类的实例,并访问Java中使用静态应用程序所做的等效操作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 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
}
}