在 Kotlin 中将强制数据传递给 super 类
Passing mandatory data to super classes in Kotlin
我在 Kotlin 中创建实体时遇到问题。特别是,它是关于将数据传递给超级 class。在下面找到一个例子。
我有一个名为 Trackable
的抽象超级 class,classes 可以扩展它。它有一个 user
属性 存储创建该特定对象的人。
abstract class Trackable(
var createdBy: User
) : Persistable()
一个名为 Contract
的 class 现在将实现 Trackable
super class,暂时出现编译时错误:
@Entity
data class Contract(
var creationDate: LocalDateTime
) : Trackable() // compile error, no user passed here
因此,由于 User
是 Trackable
中的必填字段,我必须将 User
对象传递给 Trackable
构造函数。我首先想到的是创建一个名为 creator
的瞬态 属性,我将其传递给 Trackable
。
@Entity
data class Contract(
@Transient val creator: User,
var creationDate: LocalDateTime
) : Trackable(creator)
然而,在域方面这似乎是一个非常肮脏的解决方案,因为它污染了我的 Contract
。
最近开始使用 Kotlin,我仍然缺乏合适和合理的模式来使用。谁能帮我解决这个问题?
Data classes 不能最好地使用继承,使用组合可能更好,但如果你真的想使用继承,那么恕我直言,最好的方法如下:
使用抽象字段声明抽象 class:
abstract class Trackable : Persistable(){
abstract var createdBy: User
}
扩展摘要 class 并覆盖 属性 内部数据 class:
data class Contract(
override var createdBy: User,
var creationDate: LocalDateTime) : Trackable()
这样可以避免重复 属性,同时能够从 parent
class 访问 属性 但它实际上是 children
的成员,从我的角度来看,这是最好的解决方案,因为您保留了 data class
的所有优点,但要谨慎对待它,因为它是主观的。
我在 Kotlin 中创建实体时遇到问题。特别是,它是关于将数据传递给超级 class。在下面找到一个例子。
我有一个名为 Trackable
的抽象超级 class,classes 可以扩展它。它有一个 user
属性 存储创建该特定对象的人。
abstract class Trackable(
var createdBy: User
) : Persistable()
一个名为 Contract
的 class 现在将实现 Trackable
super class,暂时出现编译时错误:
@Entity
data class Contract(
var creationDate: LocalDateTime
) : Trackable() // compile error, no user passed here
因此,由于 User
是 Trackable
中的必填字段,我必须将 User
对象传递给 Trackable
构造函数。我首先想到的是创建一个名为 creator
的瞬态 属性,我将其传递给 Trackable
。
@Entity
data class Contract(
@Transient val creator: User,
var creationDate: LocalDateTime
) : Trackable(creator)
然而,在域方面这似乎是一个非常肮脏的解决方案,因为它污染了我的 Contract
。
最近开始使用 Kotlin,我仍然缺乏合适和合理的模式来使用。谁能帮我解决这个问题?
Data classes 不能最好地使用继承,使用组合可能更好,但如果你真的想使用继承,那么恕我直言,最好的方法如下:
使用抽象字段声明抽象 class:
abstract class Trackable : Persistable(){
abstract var createdBy: User
}
扩展摘要 class 并覆盖 属性 内部数据 class:
data class Contract(
override var createdBy: User,
var creationDate: LocalDateTime) : Trackable()
这样可以避免重复 属性,同时能够从 parent
class 访问 属性 但它实际上是 children
的成员,从我的角度来看,这是最好的解决方案,因为您保留了 data class
的所有优点,但要谨慎对待它,因为它是主观的。