【发布时间】:2022-02-24 16:57:54
【问题描述】:
我想将某些 Room 实体的属性标记为内部。例如
@Entity(tableName = "users")
class User {
// ...
@ColumnInfo(name = "admin_id")
internal var adminId: String? = null
}
但是,这会产生如下编译错误:
Error:(10, 1) error: Cannot find getter for field.
实现此功能的唯一方法似乎是使用 lateinit 修饰符,但它不能用于可为空的原始字段。
我尝试了一个“hack”:一个带有内部 getter/setter 的私有字段,但这也不起作用。
编译生成的版本显然为生成的方法添加了一些后缀(setAdminId$sdk_debug),这些后缀不适用于空间。 “lateinited”字段的 setter/getter 也有这个后缀,但该字段本身保持公开状态。
有什么办法可以让列变成内部的吗?
【问题讨论】:
-
为什么要内部化?
-
因为它是不应暴露给其他开发人员的内部字段。当然,我可以创建一些其他类并在每次返回或接收对象时进行映射,但这要复杂得多,效率也低得多,只是一个内部修饰符。
-
不幸的是,这是你必须做的。只需创建另一个层,从 Room 获取数据并将您的原始对象转换为另一个。
-
我也想做同样的事情(将实体标记为内部),很遗憾它不受支持
标签: kotlin android-room