相关疑难解决方法(0)

在Kotlin中带参数的单例

我正在尝试将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)

android kotlin

43
推荐指数
6
解决办法
3万
查看次数

Kotlin线程安全本机懒惰单身与参数

在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)

singleton multithreading kotlin

19
推荐指数
3
解决办法
1万
查看次数

在kotlin中使用房间作为单身人士

我正在尝试使用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)

注意:

  1. 无法使用Object,因为Room需要使用abstract class.
  2. 单例必须是线程安全的,因为多个线程可能同时访问它.
  3. 必须能够Context作为一个论点.

我查看了所有类似的StackOverflow问题,但没有一个满足我的要求

在Kotlin中使用参数的Singleton 不是线程安全的

Kotlin - 在Android中转换Singleton DatabaseController的最佳方法 不是线程安全的

Kotlin线程使用参数 使用对象保存本机惰性单例

singleton android kotlin android-room

8
推荐指数
3
解决办法
4941
查看次数