2013-03-01 67 views
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)) 

:另外,我无法加密的数据写入到从一开始这个值是这样。我想在将对象持久化到数据库之前加密敏感数据。

任何想法?

在此先感谢!

编辑:我知道,这看起来像一个糟糕的设计,因此,如果有人有更好的主意如何处理它,我很期待收到您:)听到

回答

2

为什么不info的情况下,一流的论点呢?

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

你可以通过定义同伴的物体,像

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

这将让你与One的工作如下实施info默认值:

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)) 
} 
+0

感谢您的回答。这看起来像一个好主意,我认为对我来说这将是一个最好的解决方案:)但是,如果有人会决定,这个领域应该是懒惰? – psisoyev 2013-03-01 12:48:32

+0

还有另一个问题:someSmartService.getInformationForSomething返回一个Future,所以我在描述info val时出错了,对不起。我做了一个编辑。 – psisoyev 2013-03-01 13:00:23

+0

@britva查看我的第二个编辑。 – 2013-03-01 13:08:04