gpt4 book ai didi

android - Kotlin 中带参数的单例

转载 作者:IT老高 更新时间:2023-10-28 13:26:54 30 4
gpt4 key购买 nike

我正在尝试将 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 架构组件的简洁替代方案 sample code ,它使用 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()
}
}

关于android - Kotlin 中带参数的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40398072/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com