今回から主に探検するするコードを 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 インスタンスで十分な場合(そういうケースばかりな気もするが)はコンストラクタじゃなくてこっちのメソッド使ってくれ、ってことのようですね。