2013-03-01 90 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