Kotlin 按 class 属性 委托所有字段
Kotlin delegate all fields by class property
我有一个包装器 class Manager
,它有一个我无法修改的 属性 managerInfo
类型 UserInfo
。包装器 class 只是在信息对象周围添加业务规则。在代码中,我需要访问 managerInfo 的属性,每次写 manager.managerInfo.username
有点冗长。
我知道我可以像这样将 属性 委托给这个信息对象:
class Manager {
...
val username by UserInfo
...
}
然后我可以简单地做 manager.username
。但问题是信息 class 有大约 15 个属性,手动执行此操作会很混乱。
有没有办法通过 Kotlin lang 或某些库来委托所有属性?
你可以这样做 implementation by delegation,它看起来像这样:
interface UserCommon {
val username: String
val email: String
}
data class UserInfo(
override var username: String,
override var email: String
) : UserCommon
class Transaction(
userInfo: UserInfo
) : UserCommon by userInfo
在那之后 class Transaction
将拥有 UserCommon
拥有的所有属性,但是实现被委托给 userInfo
并传递给构造函数。
另一种方法是将 UserInfo
转换为 MutableMap
并将 属性 调用委托给该映射:
class Transaction(
userInfoMap: HashMap<String, Any>
) {
var username: String by userInfoMap
var email: String by userInfoMap
}
我有一个包装器 class Manager
,它有一个我无法修改的 属性 managerInfo
类型 UserInfo
。包装器 class 只是在信息对象周围添加业务规则。在代码中,我需要访问 managerInfo 的属性,每次写 manager.managerInfo.username
有点冗长。
我知道我可以像这样将 属性 委托给这个信息对象:
class Manager {
...
val username by UserInfo
...
}
然后我可以简单地做 manager.username
。但问题是信息 class 有大约 15 个属性,手动执行此操作会很混乱。
有没有办法通过 Kotlin lang 或某些库来委托所有属性?
你可以这样做 implementation by delegation,它看起来像这样:
interface UserCommon {
val username: String
val email: String
}
data class UserInfo(
override var username: String,
override var email: String
) : UserCommon
class Transaction(
userInfo: UserInfo
) : UserCommon by userInfo
在那之后 class Transaction
将拥有 UserCommon
拥有的所有属性,但是实现被委托给 userInfo
并传递给构造函数。
另一种方法是将 UserInfo
转换为 MutableMap
并将 属性 调用委托给该映射:
class Transaction(
userInfoMap: HashMap<String, Any>
) {
var username: String by userInfoMap
var email: String by userInfoMap
}