5

より高速なBigInt実装を実装していますが、基盤となるプラットフォームとの相互運用性を提供するためにどこまで行くべきかわかりません。

今日は a を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])
  }
...
}

これにより問題が発生する可能性がありますか、それともより良い方法がありますか?

4

1 に答える 1

3

一般に、人々がこのようなプライベート(またはドキュメント化されていない)コンストラクターまたはメソッドを使用しているのを見たとき、彼ら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

于 2012-04-07T15:14:11.990 に答える