Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

2025年1月23日
NEW! この操作を完了する権限がありません [OR-CAC-07]

2025年1月4日
【Kotlin】Android アプリ 課金実装時の ProductDetails や Purchase の内容

2024年12月11日
Jetpack Compose で Activity を取得する

2024年12月10日
android.intent.action.MY_PACKAGE_REPLACED をBorodcastReceiver で反応させるテスト

2024年12月9日
Jetpack Compose 「Modifierは子1つ目だけに適用する」の考え方

2024年12月9日
【AndroidStudio】実行時に自動でそれまでのログを消して logcat ウインドウを開く設定

2024年12月8日
【Jetpack Compose】メールアプリを最も簡単に開く方法

2024年12月4日
Android Architecture Samples でみる JetpackCompose UI コンポーネントのネスト

2024年11月27日
Jetpack Compose Material3 の ListItem で設定画面を秒でつくる

2024年11月27日
【Kotlin】バージョンカタログ libs.versions.toml の記述だるくね? module 記述のほうが良くね?

2024年11月25日
【Android】Hilt + KSP で error.NonExistentClass を解決するヒント - Protobuf / SQLDelight / ViewBinding / AIDL

2024年11月23日
【Android】AGP を 8.3+ にすると AD_SERVICES_CONFIG プロパティが衝突する

2024年11月23日
ポリシーステータス「アプリは Android 14(API レベル 34) 以降を対象とする必要があります。」が消えない

2024年11月21日
Android のアーキテクチャで何が Google に「強く推奨」されているか図で理解する

2024年11月17日
【Mac】差出人/返信先メールアドレスの変更手順とメールエイリアスの作成方法

2024年11月6日
Apple Developer 登録していれば DUNSナンバー を無料で取れる件

2024年10月23日
【Swift】公証された(またはアーカイブコピー)アプリで VideoPlayer が クラッシュする

2024年10月21日
【Mac】セブンイレブンのマルチコピー機と micro SDカード

2024年10月18日
Android OS version Market Share

2024年10月18日
🚀 iOS version Market Share

2024年10月18日
【macOS】ディスクユーティリティ で フォーマットが終わらない → SDカードが死んだ?

2024年10月17日
【SwiftUI】ScrollView や List を snap する

2024年10月15日
【macOS】DeskPad - A virtual monitor for screen sharing を使ってみる

2024年10月13日
【Mac】PDF に 無料 プレビュー アプリで自在に文字入力する方法 - 入力フォームに文字が収まらない

2024年10月12日
【Swift】画像 生 Data は UIImage や NSImage で変更されることを知る

2024年10月10日
SwiftUI・UIKit・AppKitでの画像処理の煩わしさを解消するためのヒント

2024年10月7日
【X / Twitter】アップロードしようとした動画のフレームレートが高すぎます。

2024年10月7日
【Mac】ユニバーサルコントロール / ディスプレイ が頻繁に途切れる ときの対処法

2024年10月5日
【SwiftUI】UIImage / NSImage の Image への抽象化

2024年10月2日
【ffmpeg】VP9 コーデックから H.264 コーデックへの動画変換

Kotlin で書きたい「正しいシングルトン(Singleton)」

汎用性のある使えるシングルトン、

どのように書いてますか?


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 もこのスタイルに変換されますので安心です。覚えておきたい記述です。

まとめ

なんだか気持ちが悪くても、
なかなか正解が見つけられないこと多くね? 最近。


関連ワード:  AndroidGoogleKotlinおすすめ開発