我正在实现一个更快的BigInt实现,我不确定我应该在多大程度上提供与底层平台的互操作。
现在,BigInt只包装了一个BigInteger,值bigInteger只返回包装后的值:
class BigInt(val bigInteger: BigInteger) ...因为我没有包装Java类型,所以我必须这样做
final class BigInt private(final val signum: Int,
final private[math] val arr: Array[Int])
def bigInteger: java.math.BigInteger = {
// Avoid copying of potentially large arrays.
val ctor = classOf[java.math.BigInteger]
.getDeclaredConstructor(classOf[Array[Int]], classOf[Int])
ctor setAccessible true
ctor.newInstance(arr, signum.asInstanceOf[Object])
}
...
}这会带来麻烦吗?或者有更好的方法吗?
发布于 2012-04-07 23:14:12
一般来说,当我看到人们使用这样的私有(或未记录的)构造函数或方法时,他们会捕获NoSuchMethodException并提供另一种选择:
object BigInt {
import java.math.BigInteger
private val toBigInteger: (Array[Int], Int) => BigInteger = try {
val ctor = classOf[BigInteger].getDeclaredConstructor(
classOf[Array[Int]], classOf[Int]
)
ctor.setAccessible(true)
(arr, signum) => ctor.newInstance(arr, signum.asInstanceOf[Object])
} catch { case _: NoSuchMethodException =>
(arr, signum) =>
val buffer = java.nio.ByteBuffer.allocate(arr.length * 4)
buffer.asIntBuffer.put(arr)
new BigInteger(signum, buffer.array)
}
}
final class BigInt(final val signum: Int, final val arr: Array[Int]) {
def bigInteger = BigInt.toBigInteger(arr, signum)
}我还将反射业务移到了一个伴生对象上,以避免每次调用bigInteger时都要为它支付大部分费用。
https://stackoverflow.com/questions/10054757
复制相似问题