Редактирование моего ответа, потому что я думал, что это был игрушечный пример того, что вы хотите сделать, и что ваши реальные объекты были настолько дорогими, что лень купила вам что-то. Если вопрос показывает нечто похожее на реальный код, то лень не имеет смысла. Ленивый объект крупнее и дороже в создании, чем строгий. Тем не менее, я сохраняю следующий код, потому что он показывает, как создать ленивую оболочку и что она «работает» (в том смысле, что она функционально правильна), даже если она не «работает» в смысле того, чтобы быть хорошим Идея для вашего варианта использования.
class Lazy[T] (expr : => T) {lazy val ! = expr}
object Lazy{def apply[T](expr : => T) = new Lazy({expr})}
class BigInt (val sign: Int, val num: Array[Long]) {
println("Constructing BigInt")
}
object BigInt {
val smallValues = Array(
Lazy(new BigInt(0, Array[Long]())),
Lazy(new BigInt(1, Array[Long](1))),
Lazy(new BigInt(1, Array[Long](2)))
)
private val cacheSize = smallValues.length.toLong
def apply(num: Long): BigInt = {
// Is the number cached?
if (0 <= num && num < cacheSize) smallValues(num.toInt)!
// Figure out the sign and make the number positive after that
else {
val (sign, value) = if (num < 0) (-1, num * -1) else (1, num)
new BigInt(sign, Array(value))
}
}
}
scala> BigInt(1)
Constructing BigInt
res0: BigInt = BigInt@c0dd841
scala> BigInt(1)
res1: BigInt = BigInt@c0dd841
scala> BigInt(2)
Constructing BigInt
res2: BigInt = BigInt@4a6a00ca
scala> BigInt(2)
res3: BigInt = BigInt@4a6a00ca