相关疑难解决方法(0)

为什么我们使用"伴侣对象"作为Kotlin中Java静态字段的替代?

"伴侣对象"的意图是什么?到目前为止,我一直在使用它只是为了static在需要时替换Java .

我很困惑:

  • 为什么称它为"伴侣"?
  • 这是否意味着要创建多个静态属性,我必须在companion object块内组合它?
  • 为了立即创建一个作用于类的单例实例,我经常写

:

companion object {
    val singleton by lazy { ... }
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一种单一的方式.有什么更好的方法?

kotlin kotlin-companion

141
推荐指数
4
解决办法
3万
查看次数

单身人士与科特林的争论

科特林参考说,我可以通过创建一个单例对象关键字,像这样:

object DataProviderManager {
  fun registerDataProvider(provider: DataProvider) {
    //
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想将一个参数传递给该对象.例如,Android项目中的ApplicationContext.

有没有办法做到这一点?

kotlin

26
推荐指数
3
解决办法
7560
查看次数

将静态变量从Java转换为Kotlin

我正在尝试将以下代码转换为Kotlin,并且仍然使用Java使用的一个类(Foo).进行此转换的正确方法是什么?

原始Java:

public class Foo {
   public static final String C_ID = "ID";
   public static final String C_NAME = "NAME";
   public static final String[] VALUES = {"X", "Y", "Z"};

   public static String[] getAll() {
       return new String[] {C_ID, C_NAME};
   }
}

public class Bar {
    public void doStuff() {
        String var1 = Foo.C_ID;
        String[] array1 = Foo.VALUES;
        String[] array2 = Foo.getAll();
    }
}
Run Code Online (Sandbox Code Playgroud)

自动转换Foo到Kotlin

object Foo {
    val C_ID = "ID"
    val C_NAME = "NAME"
    val VALUES = arrayOf("X", "Y", …
Run Code Online (Sandbox Code Playgroud)

static field properties kotlin

25
推荐指数
2
解决办法
2万
查看次数

在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
查看次数

为什么静态内部类单例线程安全

正如标题所说,为什么静态嵌套类单例线程安全?

public class Singleton    
{    
    private static class SingletonHolder    
    {    
        public static Singleton instance = null;
        public static Singleton getInstance(){
            if (null == instance) {
                instance = new Singleton();
            }
        }    
    }    

    public static Singleton getInstance()    
    {    
        return SingletonHolder.getInstance();    
    }    
}  
Run Code Online (Sandbox Code Playgroud)

java

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