我正在使用https://github.com/googlecodelabs/android-room-with-a-view/tree/kotlin的示例代码RoomWordsSample学习Room。
代码A来自WordRoomDatabase.kt
1:我不明白为什么作者需要添加代码INSTANCE = instance
,所以我删除了它,代码B正常运行,您能告诉我为什么吗?
2:在我看来,lambda表达式中的最新表达式将返回结果,val instance = Room.databaseBuilder( ...
是代码C中的最新表达式,但是代码C无法通过编译,为什么?
代码A
@Database(entities = [Word::class], version = 1, exportSchema = false)
abstract class WordRoomDatabase : RoomDatabase() {
abstract fun wordDao(): WordDao
companion object {
@Volatile
private var INSTANCE: WordRoomDatabase? = null
fun getDatabase(
context: Context,
scope: CoroutineScope
): WordRoomDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
WordRoomDatabase::class.java,
"word_database"
)
.addCallback(WordDatabaseCallback(scope))
.build()
INSTANCE = instance
instance
}
}
}
代码B
@Database(entities = [Word::class], version = 1, exportSchema = false)
abstract class WordRoomDatabase : RoomDatabase() {
abstract fun wordDao(): WordDao
companion object {
@Volatile
private var INSTANCE: WordRoomDatabase? = null
fun getDatabase(
context: Context,
scope: CoroutineScope
): WordRoomDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
WordRoomDatabase::class.java,
"word_database"
)
.addCallback(WordDatabaseCallback(scope))
.build()
instance
}
}
}
代码C
@Database(entities = [Word::class], version = 1, exportSchema = false)
abstract class WordRoomDatabase : RoomDatabase() {
abstract fun wordDao(): WordDao
companion object {
@Volatile
private var INSTANCE: WordRoomDatabase? = null
fun getDatabase(
context: Context,
scope: CoroutineScope
): WordRoomDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
WordRoomDatabase::class.java,
"word_database"
)
.addCallback(WordDatabaseCallback(scope))
.build()
}
}
}
代码A是Singleton模式的实现。它的目的是只有一个类的一个实例。因此,代码A检查INSTANCE
是否为空(是否创建了类实例),如果不是,则创建WordRoomDatabase类的实例并将其分配给INSTANCE
变量。随后对getDatabase
的调用将返回INSTANCE
,并且不会每次都创建新的WordRoomDatabase
。
代码B破坏了此模式,没有将instance
保存到静态INSTANCE
变量中。代码可以使用,但是随后每次调用getDatabase
都会创建WordRoomDatabase
的新实例。
代码C无效,因为getDatabase
方法必须返回WordRoomDatabase
实例,但不返回任何值(赋值不是Kotlin中的表达式)