0

我有:

case class One(someParam: String) {
private val _defaultTimeout = readFromConfig("defaultTimeout")
val timeout: Timeout = akka.util.Timeout(_defaultTimeout seconds)
val info: Option[Info] = Await.result(someSmartService.getInformationForSomething(someParam)), timeout.duration)
}

我正在构建一项服务,它将隐藏(加密)一些敏感数据。我正在这样做:

def encrypt(oldOne: One): One = {
  val encryptedSomeParam = EncryptService.getHash(oldOne.someParam)
  val encryptedInfo = encryptInfo(oldOne.info)
  // what to do with that? ^^
  one.copy(someParam = encryptedSomeParam)
}

另外,我需要在第一类的“信息”字段中加密一些数据。问题是它是一个 val,我不能重新分配一个 val 的值。有没有简单的方法可以做到这一点?现在我正在考虑将其更改为 var,但我认为这不是最好的方法。另外,我不能像这样从一开始就将加密数据写入该值:

val info: Option[Info] = EncryptionService.encrypt(someSmartService.getInformationForSomething(someParam))

由于此字段用于我需要不加密字段的其他地方。我想在对象持久化到数据库之前加密敏感数据。

有任何想法吗?

提前致谢!

编辑:我知道,这看起来是一个糟糕的设计,所以如果有人对如何处理它有更好的想法,我期待着收到你的来信:)

4

1 回答 1

2

为什么不做info一个案例类论点呢?

case class One(someParam: String, info: Option[Info])

info您可以通过定义伴随对象来实现默认值

object One {
  def apply(someParam: String): One = One(someParam, someSmartService.getInformationForSomething(someParam))
}

这将允许您使用Ones 如下:

One("foo")
One("foo", Some(...))
One(encryptedSomeParam, encryptedInfo)
One("plaintext").copy(someParam = encryptedSomeParam, info = encryptedInfo)

编辑1:懒惰的信息

案例类不能有惰性 val 参数,即既不info: => Option[String]lazy val info: Option[String]不允许作为参数类型。

不过,您可以创建info一个无参数函数

case class One(someParam: String, info: () => Option[String])

object One {
  def apply(someParam: String): One = One(someParam, () => Some(someParam))
}

然后将其用作

One("hi", () => Some("foo"))
println(One("hi", () => None).info())

这显然是不理想的,因为在不破坏代码客户端代码的情况下不可能引入这些更改。欢迎更好的解决方案。

编辑 2:懒惰的信息,没有案例类

如果您不坚持One成为案例类(例如,因为您确实需要copy),则可以使用具有惰性值和伴随对象的常规类以方便使用:

class One(_someParam: String, _info: => Option[String]) {
  val someParam = _someParam
  lazy val info = _info
}

object One {
  def apply(someParam: String): One = new One(someParam, Await.result(...))
  def apply(someParam: String, info: => Option[String]): One = new One(someParam, info)
  def unapply(one: One) = Some((one.someParam, one.info))
}
于 2013-03-01T12:44:28.623 回答