创建单个更新程序对象

时间:2015-10-12 19:50:14

标签: scala

我正在尝试创建一个只能更新一次的类型。在请求对象有值,如果访问它将抛出异常。之后用户可以更新对象,但其他更新将被忽略。 这是为了有一种状态对象更新其状态一次,在流程中,忽略更新方法的实际imp,但我得到变量,逆变的编译错误... 有没有办法解决它?

 case class EmptyValueException(message: String = "empty value") extends RuntimeException(message)

 trait SingleUpdate[+T] {
     def get: T
 }

 case object EmptyValue extends SingleUpdate[Nothing] {
      def get: Nothing = throw EmptyValueException()
 }

 case class HasValue[+T](value: T) extends SingleUpdate[T] {
    def get: T = value
 }

 object SingleUpdater {
    def apply[T]() = new SingleUpdater[T]()
 }

 class SingleUpdater[+T] {
      var single: SingleUpdate[T] = EmptyValue
      def get = single.get
      def update[T](value: T) = single = HasValue[T](value)
  }

1 个答案:

答案 0 :(得分:1)

这里有一个快速编译的意图实现,尽管它在类型MyLogger(musicdl=myapp)中是不变的。此外,它忽略了第一个之后的更新,这是我理解你的意图。它会默默地执行此操作,您可能希望更改它(例如,如果尝试再次更新则抛出异常)。

T

使用示例:

case class EmptyValueException(message: String = "empty value") extends RuntimeException(message)

trait SingleUpdate[T] {
  def get: T = throw EmptyValueException()
  def isSet = false
}

case class HasValue[T](value: T) extends SingleUpdate[T] {
  override def get: T = value
  override def isSet = true
}

object SingleUpdater {
  def apply[T]() = new SingleUpdater[T]()
}

class SingleUpdater[T] {
  var single: SingleUpdate[T] = new SingleUpdate[T] {}
  def get = single.get
  def update(value: T) = if (!single.isSet) single = HasValue[T](value)
}