我正在对将保留在数据库中的实体进行建模。以用户实体为例,我想以这种方式使用它们:
val userBeforePersisting = new User("Joe", "joe@gmail.com")
// DB access code (where rs is a ResultSet)
val foundUser = new User(rs.getLong("id"), rs.getString("name"), rs.getString("email"))
我想使用相同的用户代码(即最小化代码重复),同时拥有两种类型的用户:
- 预持久化用户没有 ID
- 从数据库中检索到的持久用户有一个 ID
我想在编译时尽可能严格地执行这一点。
我希望能够对所有用户一视同仁,除非我尝试从非持久用户那里获取 ID,否则将引发错误或无法编译。
我想避免像这样制作单独的课程
class NewUser(val name: String, val email: String)
class PersistedUser(val id: Long, val name: String, val email: String)
由于代码重复(姓名和电子邮件字段),我不喜欢这个解决方案。
这是我的想法:
class User(val id: Long, val name: String, val email: String) {
this(name: String, email: String) = this(0l, name, email)
this(id: Long, name: String, email: String) = this(id, name, email)
}
但是后来我的非持久用户有一个id
.0l
这是另一种方法:
trait User {
val name: String
val email: String
}
class NewUser(val name: String, val email: String) extends User
class PersistedUser(val id: Long, val name: String, val email: String) extends User
这给了我想要的编译时检查。我不确定这是否有任何缺点。
也许我可以尝试这样的事情:
class User(val name: String, val email: String)
trait Persisted { val id: Long }
class PersistedUser(val id: Long, val name: String, val email: String)
extends User(name, email)
with Persisted
对这些方法有什么想法吗?我从来没有这样做过,所以我不确定我是否理解所有后果。