コンポーネントには、後でキーとしてキャッシュに使用する long 値が渡されます。キー自体は、符号なしの 64 ビット値であるかのように、long 値の文字列表現です。つまり、コンポーネントが -2944827264075010823L に渡された場合、それを文字列キー "15501916809634540793" に変換する必要があります。
解決策はありますが、力ずくのようで、少し吐き気がします。基本的に、long を 16 進数の文字列表現に変換し (つまり、-2944827264075010823L は "d721df34a7ec6cf9" になります)、16 進数の文字列を BigInteger に変換します。
String longValueAsHexString = convertLongToHexString(longValue);
BigInteger bi = new BigInteger(longValueAsHexString, 16);
String longValueString = bi.toString();
次に、キャッシュへのキーとして longValueString を使用します。
Long.toString(longValue,16) は使用できません。これは、絶対値の 16 進文字列が返され、接頭辞が "-" になっているためです。
したがって、私の convertLongToHexString は次のようになります。
long mask = 0x00000000ffffffffL;
long bottomHalf = number & mask;
long upperHalf = (number >> 32) & mask;
String bottomHalfString = Long.toString(bottomHalf, 16);
if (bottomHalfString.length() != 8) {
String zeroes = "0000000000000000";
bottomHalfString = zeroes.substring(16-bottomHalfString.length()) + bottomHalfString;
}
return Long.toString(upperHalf,16)+bottomHalfString;
これを行うためのよりエレガントな方法が必要です。助言がありますか?