汎用性のある使えるシングルトン、
どのように書いてますか?
class Singleton private constructor() {
  // getInstance() ???
}
ここから、どんな getInstance() を?
いくつか。
fun getInstance(): Singleton {
  synchronized(this) {
    if(INSTANCE == null){
      INSTANCE = Singleton()
    }
    return INSTANCE!!
  }
}
companion object {
  private var INSTANCE: Singleton ? = null
  fun getInstance(): Singleton {
    if(INSTANCE == null){
      INSTANCE = Singleton()
    }
    return INSTANCE!!
  }
}
companion object {
  val INSTANCE = Singleton()
  fun  getInstance(): Singleton {
    return INSTANCE
  }
}
@Volatile private var INSTANCE: Singleton ? = null
fun getInstance(): Singleton {
  if(INSTANCE == null){
    synchronized(this) {
      INSTANCE = Singleton()
    }
  }
  return INSTANCE!!
}
companion object {
  @Volatile private var INSTANCE: Singleton ? = null
  fun getInstance(): Singleton {
    return INSTANCE?: synchronized(this){
      Singleton().also {
        INSTANCE = it
      }
    }
  }
}
Singleton Pattern — What you might be doing wrong! – Hacker Noon
正解?
Googleの人はこう書いてます。
class CheeseRepository(
  private val api: CheeseApi,
  private val db: CheeseDatabase,
  private val executor: Executor
) {
  companion object {
    private const val PAGE_SIZE = 30
    private var instance: CheeseRepository? = null
    fun getInstance(context: Context) = instance ?: synchronized(this) {
      instance ?: CheeseRepository(
          CheeseApi(),
          Room.databaseBuilder(context, CheeseDatabase::class.java, "cheese").build(),
          Executors.newFixedThreadPool(4)
      ).also { instance = it }
    }
  }
CheesePage/CheeseRepository.kt at master · yaraki/CheesePage
あと、Dagger の @Singleton もこのスタイルに変換されますので安心です。覚えておきたい記述です。
まとめ
なんだか気持ちが悪くても、
なかなか正解が見つけられないこと多くね? 最近。
 
		 
           
          