1

I'm having trouble converting an inherited singleton pattern from Java to 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()
   }
}

From one of the main classes (not lite) I call ThumbnailManager.getInstance().gameData and gameData is null, even though it was definitely initialized through ThumbnailManagerLite. I notice that when I call ThumbnailManagerLite.getInstance() there is no call through to super.

galaxigirl
  • 2,390
  • 2
  • 20
  • 29

1 Answers1

2

Every time you call ThumbnailManager.getInstance() you create a new instance of ThumbnailManager. In Kotlin you can use object keyword to implement a Singleton pattern:

object ThumbnailManager {
    
    lateinit var data: Data

    fun setContent() { 
    }

    fun setData() {
    }
}

But it doesn't support inheritance.

You can try to use Delegation instead of inheritance in singleton:

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()
    }
}
Sergio
  • 27,326
  • 8
  • 128
  • 149