加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

oop – Scala:带选项的构造函数方法

发布时间:2020-12-16 10:07:34 所属栏目:安全 来源:网络整理
导读:出于非相关原因避免使用通常的ORM,我正在尝试编写一个既可以从数据库中显示数据又可以向其添加/更新数据的类(这首先是一个好主意?). class Car (val _id:ID,val _name:String = "") { def this(_id:ID) = { val car = DB.fetchCar(_id) this(_id,car.name)
出于非相关原因避免使用通常的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读