내가 찾을 수는 (약한되지 않음) 참조 소프트 이것을 위해 매우 편리합니다. 약한 참조는 필요하지 않은 모든 GC를 먹어서 반복적으로 액세스하면 많은 노력을 낭비 할 수 있습니다. 소프트 참조는 메모리 압력이있을 때만 먹습니다 (공식적으로 모든 GC 일 수 있지만 최소한 JVM은 약간의 재량권을 행사할 수 있음).
class Soft[T,U](t: T)(gen: T => U) {
private[this] var cache = new java.lang.ref.SoftReference(gen(t))
def apply(): U = {
var u = cache.get()
if (u==null) {
u = gen(t)
cache = new java.lang.ref.SoftReference(u)
}
u
}
}
object Soft {
def apply[T,U](t: T)(gen: T => U) = new Soft(t)(gen)
}
지금 당신이
Soft
에서 물건의 적절한 양을 포장하고, 당신이 그것을 원할 때 당신은 데이터를 얻을 수
()
를 사용 : 어쨌든, 스칼라에 사용이 매우 편리합니다
val soft = Soft(10)(n => Array.tabulate(n)(i => i*i*i))
soft()(3) // 27
을
부드러운 참조 (일반적으로 두 개의 객체 생성과 동일)를 얻으려면 완전히 무시할 수없는 처벌이 있습니다. 따라서 무언가를 많이 사용하려면 먼저 잡아서 작업하십시오.
val arr = soft()
// Intensive operations with arr