Kotlin中两类WordRepository声明的差异及报错原因咨询
两段Kotlin代码的差异及报错原因解析
第一段可正常运行的代码
class WordRepository(private val wordDao: WordDao) { suspend fun insertWord(word: Word) = wordDao.insert(word) }
第二段报错的代码
class WordRepository(wordDao: WordDao) { suspend fun insertWord(word: Word) = wordDao.insert(word) }
核心差异与报错原因
参数的性质差异
- 第一段代码里的
private val wordDao: WordDao是类的成员属性声明:在主构造函数参数前加上val(或var)后,Kotlin会自动将这个参数转化为类的成员变量,还能通过private这类修饰符控制可见性。类内部的所有成员函数(比如insertWord)都能直接访问这个属性。 - 第二段代码里的
wordDao: WordDao只是主构造函数的局部参数:没有val/var修饰时,这个参数的作用域仅限主构造函数本身(比如初始化代码块init{}内),类的成员函数无法访问它,所以在insertWord中调用wordDao.insert(word)时会提示“wordDao is not defined”。
- 第一段代码里的
修复第二段代码的两种方法
- 方法一:给参数加上
val/var,直接转为类成员属性:class WordRepository(val wordDao: WordDao) { suspend fun insertWord(word: Word) = wordDao.insert(word) } - 方法二:手动将参数赋值给类成员属性:
class WordRepository(wordDao: WordDao) { private val innerWordDao = wordDao suspend fun insertWord(word: Word) = innerWordDao.insert(word) }
- 方法一:给参数加上
内容的提问来源于stack exchange,提问作者Boyce Chen
相关产品推荐
相关产品推荐

