이것은 할 수있는 방법이 아니다. 가능성의 증거. 이런 식으로 당신은 많은 문제를 겪을 수 있습니다.
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class A(i: Int)
class B(a: A){
var s: String = ""
}
object B{
val as = scala.collection.mutable.WeakHashMap[A, B]()
}
implicit def a2b(a: A) = B.as.getOrElseUpdate(a, new B(a))
// Exiting paste mode, now interpreting.
defined class A
defined class B
defined module B
a2b: (a: A)B
scala> val a = A(1)
a: A = A(1)
scala> a.s = "test"
scala> a.s
res0: String = test
WeakHashMap
: 약하게 도달 가능한 항목에 대한 참조가있는 해시 맵. 키가 더 이상 (강하게) 참조되지 않으면이 맵에서 항목이 제거됩니다. 이 클래스는 java.util.WeakHashMap를 랩합니다.
scala> A(2).s = "test2"
scala> A(2).s
res2: String = test2
그래서 당신은 case class
를 사용하거나 override def equals(that: Any) = this eq that.asInstanceOf[AnyRef]
와 함께 사용하지 않아야 인해 case class
년대는이 재미있는 동작을 얻을 equals
방법을 무시한다는
는
참고.
이와 같은 제안을하지 마십시오. 이것은 매우 추악 할뿐만 아니라 안전하지도 않습니다. – drexin
@drexin 원한다면이 threadsafe (단일 jvm에서)를 만들 수 있습니다. – senia
@drexin 네 말이 맞아. 내 대답을 업데이트했습니다. – senia