为什么 lambda 表达式需要在 Android Kotlin 中显式返回?

Hel*_*oCW 0 android kotlin

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

Yri*_*kin 5

代码 A 是单例模式的实现。它的目标是只有一个类的实例。因此,代码 A 检查是否INSTANCE为空(是否创建了类实例),如果不是,则创建 WordRoomDatabase 类的实例并将其分配给INSTANCE变量。后续调用getDatabase将返回INSTANCE,而不是WordRoomDatabase每次都创建新的。

代码 B 打破了这种模式,而不是保存instance到静态INSTANCE变量。代码将起作用,但是对于每个后续调用getDatabase新实例的WordRoomDatabase将被创建。

代码 C 不工作,因为getDatabase方法必须返回 WordRoomDatabase实例,但它什么都不返回(赋值不是 Kotlin 中的表达式)