0

我无法将继承的单例模式从 Java 转换为 Kotlin。

open class ThumbnailManager {

   lateinit var data: Data

   companion object{
       fun getInstance(): ThumbnailManager{
           return ThumbnailManager()
       }
     }
     open fun setContent()
     open fun setData(){
         data = ...// data is indeed set 
     }
}

class ThumbnailManagerLite : ThumbnailManager(){

   companion object{
       fun getInstance(): ThumbnailManagerLite{
           return ThumbnailManagerLite()
       }
   }

   override fun setContent(){
       setData()
   }
}

从主要类之一(不是精简版)我调用 ThumbnailManager.getInstance().gameData 并且 gameData 为空,即使它肯定是通过 ThumbnailManagerLite 初始化的。我注意到,当我调用 ThumbnailManagerLite.getInstance() 时,没有调用 super。

4

1 回答 1

1

每次调用时,ThumbnailManager.getInstance()您都会创建一个ThumbnailManager. 在 Kotlin 中,您可以使用object关键字来实现单例模式:

object ThumbnailManager {
    
    lateinit var data: Data

    fun setContent() { 
    }

    fun setData() {
    }
}

但它不支持继承。

您可以尝试在单例中使用委托而不是继承

interface IThumbnailManager {
    fun setContent()
    fun setData()
}

object ThumbnailManager : IThumbnailManager {

    lateinit var data: Data


    override fun setContent() {
    }

    override fun setData(){
    }
}

object ThumbnailManagerLite : IThumbnailManager by ThumbnailManager {

    override fun setContent(){
        setData()
    }
}
于 2020-07-07T10:50:13.330 回答