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

问题描述 投票:0回答:1

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

            }
        }
}
android kotlin
1个回答
1
投票

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

代码B破坏了此模式,没有将instance保存到静态INSTANCE变量中。代码可以使用,但是随后每次调用getDatabase都会创建WordRoomDatabase的新实例。

代码C无效,因为getDatabase方法必须返回WordRoomDatabase实例,但不返回任何值(赋值不是Kotlin中的表达式)

© www.soinside.com 2019 - 2024. All rights reserved.