我正在尝试将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;
}
}
Run Code Online (Sandbox Code Playgroud)
我在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 …Run Code Online (Sandbox Code Playgroud) 在java中,我们可以使用双重Checked Locking&volatile编写thead-safe单例:
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance(String arg) {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton(arg);
}
}
}
return localInstance;
}
}
Run Code Online (Sandbox Code Playgroud)
我们怎么能用kotlin写呢?
object A {
object B {}
object C {}
init {
C.hashCode()
}
}
Run Code Online (Sandbox Code Playgroud)
我使用kotlin反编译器来实现
public final class A {
public static final A INSTANCE;
private A() { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Room作为单身人士,所以我不必再调用Room.databaseBuilder()- 这是昂贵的 - 不止一次.
@Database(entities = arrayOf(
Price::class,
StationOrder::class,
TicketPrice::class,
Train::class,
TrainCategory::class
), version = 2)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun dao(): TrainDao
companion object {
fun createDatabase(context: Context): AppDatabase
= Room.databaseBuilder(context, AppDatabase::class.java, "trains.db").build()
}
}
Run Code Online (Sandbox Code Playgroud)
注意:
abstract class.Context作为一个论点.我查看了所有类似的StackOverflow问题,但没有一个满足我的要求
在Kotlin中使用参数的Singleton 不是线程安全的
Kotlin - 在Android中转换Singleton DatabaseController的最佳方法 不是线程安全的
Kotlin线程使用参数 使用对象保存本机惰性单例