2013-03-01 2 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]) 
당신은 다음과 같이 One들과 함께 작업 할 수 있도록 할

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

같은 동반자 객체 정의하여 info에 대한 기본값을 구현할 수

:

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

EDIT 1 : 게으른 정보

사례 클래스는 지연 인수를 가질 수 없습니다. 즉, info: => Option[String] 또는 lazy val info: Option[String]은 인수 유형으로 사용할 수 없습니다. 그것을 파괴하지 않고 이러한 변경 사항을 소개하는 것은 불가능하기 때문에

당신이 분명히 좋지 않은

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

로 사용 후,

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

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

info 매개 변수가없는 함수를 만들 수 있습니다 코드 클라이언트 코드. 더 나은 솔루션을 환영합니다.

편집 2 : 게으른 정보, 어떠한 경우 클래스

(당신이 정말로 copy을 필요로하기 때문에, 예를 들어) 당신이 경우 클래스 인 One 주장하지 않는 경우, 당신은 게으른와 일반 클래스를 사용할 수 있습니다 값 및 손쉬운 사용을위한 보조 개체 :

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

+0

그리고 또 다른 문제가 있습니다. someSmartService.getInformationForSomething이 미래를 반환하므로 정보를 설명하는 데 실수를했습니다. 미안합니다. 나는 그것을 편집했다. – psisoyev

+0

@britva 제 두 번째 편집을보십시오. –

관련 문제