我正在使用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
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码 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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码 A 是单例模式的实现。它的目标是只有一个类的实例。因此,代码 A 检查是否INSTANCE为空(是否创建了类实例),如果不是,则创建 WordRoomDatabase 类的实例并将其分配给INSTANCE变量。后续调用getDatabase将返回INSTANCE,而不是WordRoomDatabase每次都创建新的。
代码 B 打破了这种模式,而不是保存instance到静态INSTANCE变量。代码将起作用,但是对于每个后续调用getDatabase新实例的WordRoomDatabase将被创建。
代码 C 不工作,因为getDatabase方法必须返回 WordRoomDatabase实例,但它什么都不返回(赋值不是 Kotlin 中的表达式)
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |