我正在建模将保留在数据库中的实体。使用用户实体作为一个例子,我想用这种方式与他们一起工作:只读实体的Scala数据模型
val userBeforePersisting = new User("Joe", "[email protected]")
// 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)
}
但后来我未坚持用户有0l
的id
。
这里的另一种方法:
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
任何思考这些方法?我从来没有这样做过,所以我不确定我是否理解了所有的后果。
你不喜欢最后一种方法?是'val name:String,val email:String'出现两次的次要代码重复吗? – Faiz