"伴侣对象"的意图是什么?到目前为止,我一直在使用它只是为了static在需要时替换Java .
我很困惑:
companion object块内组合它?:
companion object {
val singleton by lazy { ... }
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一种单一的方式.有什么更好的方法?
在科特林参考说,我可以通过创建一个单例对象关键字,像这样:
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
//
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想将一个参数传递给该对象.例如,Android项目中的ApplicationContext.
有没有办法做到这一点?
我正在尝试将以下代码转换为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) 我正在尝试使用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线程使用参数 使用对象保存本机惰性单例
正如标题所说,为什么静态嵌套类单例线程安全?
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)