我想知道在Scala中是否存在规则或者更确切地说是“最佳实践”以覆盖apply / unapply。我特别感兴趣的是保持以下属性是否是个好主意:
给定案例类C(x:T),对于所有x,Some(x)== C.unapply(C.apply(x))。
我问的原因是因为我打算使用以下代码来确保BigDecimal的精度为16。
class BoundedBigDecimal(private val bd: BigDecimal) extends Proxy {
val self: BigDecimal = bd setScale (BoundedBigDecimal.PRECISION)
}
object BoundedBigDecimal {
val PRECISION = 16
def apply(bd: BigDecimal) = new BoundedBigDecimal(bd)
def unapply(bbd: BoundedBigDecimal) = Some(bbd.self)
}
如你所见,该物业不一定就在这里。
是吗:
1)理想情况下应该在一般情况下强制实施的财产?
2)正确的方法去做我想做的事情?
谢谢!
答案 0 :(得分:2)
我更喜欢使用“标记类型”:
type Tagged[U] = { type Tag = U }
type @@[T, U] = T with Tagged[U]
trait Bounded
object BoundedBigDecimal {
val PRECISION = 16
def apply(bd: BigDecimal) =
(bd setScale PRECISION).asInstanceOf[BigDecimal @@ Bounded]
def unapply(bbd: BigDecimal @@ Bounded) =
Some(bbd)
implicit def toBD(bd: BigDecimal): BigDecimal @@ Bounded =
BoundedBigDecimal(bd)
}
答案 1 :(得分:0)
为什么不使用:
def testPrecision(bd:BigDecimal):Boolean =
db.scale == 16
还是我错过了什么?
编辑:更新为ReducePrecision:
def boundedBD(bd:BigDecimal):BigDecimal =
{
val maxPrecision = 16
bd.scale match {
case x if x > maxPrecision => bd setScale maxPrecision
case _ => bd
}
}