これには、ソフト(弱ではない)参照が非常に便利だと思います。弱い参照は、不要な GC ごとに消費されます。これは、繰り返しアクセスされると、多くの労力を浪費する可能性があります。ソフト参照は、メモリ プレッシャーがある場合にのみ使用されます (正式にはすべての GC である可能性がありますが、少なくとも JVM は少し裁量を行使できます)。とにかく、Scala で使用する場合、これは非常に便利です。
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