[解決済み] Kotlinのパラメータ付きシングルトン
2022-12-28 14:05:37
質問
AndroidアプリをJavaからKotlinに変換しようとしています。アプリにはいくつかのシングルトンがあります。私はコンストラクタのパラメータを持たないシングルトン用のコンパニオンオブジェクトを使用しました。コンストラクタのパラメータを取る別のシングルトンがあります。
Javaコードです。
public class TasksLocalDataSource implements TasksDataSource {
private static TasksLocalDataSource INSTANCE;
private TasksDbHelper mDbHelper;
// Prevent direct instantiation.
private TasksLocalDataSource(@NonNull Context context) {
checkNotNull(context);
mDbHelper = new TasksDbHelper(context);
}
public static TasksLocalDataSource getInstance(@NonNull Context context) {
if (INSTANCE == null) {
INSTANCE = new TasksLocalDataSource(context);
}
return INSTANCE;
}
}
kotlinでの私の解決策。
class TasksLocalDataSource private constructor(context: Context) : TasksDataSource {
private val mDbHelper: TasksDbHelper
init {
checkNotNull(context)
mDbHelper = TasksDbHelper(context)
}
companion object {
lateinit var INSTANCE: TasksLocalDataSource
private val initialized = AtomicBoolean()
fun getInstance(context: Context) : TasksLocalDataSource {
if(initialized.getAndSet(true)) {
INSTANCE = TasksLocalDataSource(context)
}
return INSTANCE
}
}
}
何か見逃していませんか?スレッドの安全性?怠け癖?
似たような質問がいくつかありましたが、私はその答えが好きではありません :)
どのように解決するのですか?
Google のアーキテクチャ コンポーネントから、すてきな代替案を紹介します。
サンプルコード
で、これは
also
関数を使用しています。
class UsersDatabase : RoomDatabase() {
companion object {
@Volatile private var INSTANCE: UsersDatabase? = null
fun getInstance(context: Context): UsersDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(context.applicationContext,
UsersDatabase::class.java, "Sample.db")
.build()
}
}
関連
-
[解決済み] Kotlin 三項条件演算子
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] AndroidにおけるViewPager2の適切な実装
-
[解決済み] Androidのソースコードにある@hideの意味とは?
-
[解決済み] Android Studioの「未実装メソッドの追加」機能
-
[解決済み] 通知をクリックした後にアプリケーションを開く
-
[解決済み] AsyncTaskLoaderとAsyncTaskの比較
-
[解決済み] サポートライブラリのアクションバーをPreferenceActivityに追加するには?
-
[解決済み] 文字列リソースにHTML?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Android Debug Bridgeでアプリケーションのインストール時にINSTALL_FAILED_VERSION_DOWNGRADEを無視する方法はありますか?
-
[解決済み] プログラム的に電話をかけるには?
-
[解決済み] HttpPostによる画像送信
-
[解決済み] プログラムでソフトキーボードを開く
-
[解決済み] handler.postDelayed()を停止する。
-
[解決済み] これはどういうことですか?失敗 [INSTALL_FAILED_CONTAINER_ERROR]?
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] アンドロイドのdatepickerダイアログで最大の日付を設定するには?
-
[解決済み] Recyclerviewと異なるタイプの行のインフレーションの処理