我正在建模將保留在數據庫中的實體。使用用戶實體作爲一個例子,我想用這種方式與他們一起工作:只讀實體的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