BigDecimal#equalsを眺めていたらよくわからん実装されていた。
/** * Compares this BigDecimal with the specified Object for equality. Unlike * {@link #compareTo compareTo}, this method considers two BigDecimals * equal only if they are equal in value and scale (thus 2.0 is not equal to * 2.00 when compared by this method). * * @param x * Object to which this BigDecimal is to be compared. * @return <tt>true</tt> if and only if the specified Object is a * BigDecimal whose value and scale are equal to this BigDecimal's. * @see #compareTo(java.math.BigDecimal) */ public boolean equals(Object x) { if (!(x instanceof BigDecimal)) return false; BigDecimal xDec = (BigDecimal) x; if (intVal == null) intVal = BigInteger.valueOf(intLong); if (xDec.intVal == null) { try { final long lTemp = xDec.intLong; BigInteger biTemp = (BigInteger) (java.security.AccessController .doPrivileged(new java.security.PrivilegedExceptionAction() { public Object run() { return BigInteger.valueOf(lTemp); } })); xDec.intVal = biTemp; } catch (java.security.PrivilegedActionException pae) { xDec.intVal = BigInteger.valueOf(xDec.intLong); } } //End of intLong support return scale == xDec.scale && intVal.equals(xDec.intVal); }
この以下の部分がよくわからん。なんでこんなPrivilegedActionとか呼び出しているのか
BigInteger biTemp = (BigInteger) (java.security.AccessController .doPrivileged(new java.security.PrivilegedExceptionAction() { public Object run() { return BigInteger.valueOf(lTemp); } }));
んでちょっと調べてみたらPrivilegedActionは「特権を有効にして実行する計算」らしい。
PrivilegedAction (Java Platform SE 6)
なんだけども特権計算とは何なのか、なんで必要なんだ、と調べていたら以下のSunからの情報を見つけました。を
特権ブロック API
SDK のインストールポリシーにより、特定のコードソースに基づくコードに対して許可されるアクセス権、つまりシステムリソースに対するアクセスの種類が決まります。
・・中略・・
そのとき有効になっているセキュリティポリシーの決定に従って、CodeSource 自体と、その CodeSource に基づくコードに対して許可されているアクセス権は、「保護ドメイン」に包み込まれます。したがって、同じ鍵で署名された同じ URL にあるクラスは、同じドメインに入れられて、クラスは 1 つの保護ドメインだけに所属します。同じアクセス権を与えられていても、別のコードソースが基になっているクラスは、別のドメインに属します。
・・中略・・
アプレットまたはアプリケーションは、それぞれのコードソースによって決められるドメイン内で動作します。アプレットまたはセキュリティマネージャの下で実行されるアプリケーションに、セキュリティ保護された動作 (ファイルの読み取りや書き込みなど) を許可するには、その特定の動作に対するアクセス権をアプレットやアプリケーションに与える必要があります。
・・中略・・
つまり、リソースにアクセスしようとする場合は常に、その地点に至るまでに実行スレッドがたどってきたすべてのコードが、そのリソースアクセスのためのアクセス権を持っていなければなりません。
・・中略・・
コードを「特権付き」に指定すると、信頼できるコードは、それを呼び出しているコードが直接利用できるものより多くのリソースに、一時的にアクセスできるようになります。
ということでアプレット等で使用する場合を考慮して特権計算をしているようだ。
しかしなんで「BigInteger.valueOf(lTemp)」に特権が必要になることがあるのかがわからんなぁ