出于非相关原因避免使用通常的ORM,我正在尝试编写一个既可以从数据库中显示数据又可以向其添加/更新数据的类(这首先是一个好主意?).
class Car (val _id:ID,val _name:String = "") { def this(_id:ID) = { val car = DB.fetchCar(_id) this(_id,car.name) } def this(_name:String) = this(null,_name) def isSynced:Boolean = { ... } def sync { ... } }
这意味着你可以:
>知道记录的id和名称,创建一个表示它的对象,
>只知道记录的id,你可以从DB构造rep对象
>如果您不提供id,则您的对象将处于未同步状态,并在添加/更新发生后同步.
问题是,第一个构造函数依赖于DB操作,因此Option [Car]作为返回类型更有意义.但据我所知,Scala不允许你做类似的事情:
def this(_id:ID):Option[Car] = { try { val car = DB.fetchCar(_id) Some(this(_id,car.name)) } catch { case e:Exception => None } }
这有意义吗?你会如何实现这个?
解决方法
您可以从班级的伴侣对象中执行此操作:
class Car private (data: CarData) { ... } object Car { def apply(id: Int): Option[Car] = { DB.find(id) match { case Some(data) => Some(new Car(data)) case _ => None } } def apply(data: CarData): Car = { new Car(data) } }
这允许客户端代码
val someId: Int = ... val maybeCar = Car(someId) // Will be Option[Car] val someKnownData: CarData = ... val definitiveCar = Car(someKnownData) // Will be Car
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。