kagamihogeの日記

kagamihogeの日記です。

java.lang.Byte 探訪

今回から主に探検するするコードを JDK1.5 に変更。1.4 と比較して大きい違いがあったら、都度メモしていこうかなと思います(理解できればだけど)。

java.lang.Byte の 1.4 と 1.5 の違い

このクラスは、そんなに大きい違いはないだろうなぁ、との予想通りそれほどはないです。目立つのは、Generics の導入とコメント文が大きく変わってます。

地味だけど気になる変更はコレ。

1.4.2_11

private byte value;

1.5.0_06

private final byte value;

immutable なクラスだし final つけたほうがよくねー?って感じで追加したんでしょうかね。

ちょっと笑ったのがコレ。parseByte(String s) の javadoc から抜粋。
1.4.2_11

* @exception	NumberFormatException if the the string does not

1.5.0_06

* @exception	NumberFormatException if the string does not

やっぱりタイプミスってあるんだねぇ。

java.lang.Byte の 1.4 と 1.5 の違い その2

ソースを比較してみると、1.5 には下のメソッドが追加されている。


public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}

追加された理由はとりあえずおいておくとして、byte から Byte インスタンスへの変換を配列でやっている点が面白い。

これはソースを見た方が早いので、とりあえずそのまま抜粋。


private static class ByteCache {
private ByteCache(){}

static final Byte cache[] = new Byte[-(-128) + 127 + 1];

static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Byte((byte)(i - 128));
}
}

-128 から 127 の数値に対応するByte型のインスタンスを配列に格納している。つまるところ配列の中身は、

index 0 1 ... 127 128 129 ... 254 255
Byteインスタンス -128 -127 ... -1 0 1 ... 126 127

こうなる。よって、byte に対応する Byte 型のインスタンスが欲しい場合は、byte + 128 番地の要素を拾うだけでよくなる。

javadoc にもあるとおり、使いまわしの Byte インスタンスで十分な場合(そういうケースばかりな気もするが)はコンストラクタじゃなくてこっちのメソッド使ってくれ、ってことのようですね。