2.12. java.lang.Long。intの倍のサイズの整数long用のクラス¶
longは64bitサイズの整数型です。intは32bitですので大きさが2倍です。
intほどは使わないですが、大きなサイズの整数を扱いたいときに使います。
2.12.1. クラス図へ変換¶
では、早速クラス図にしてみましょう。
UML変換くんを実行。
> touml .\java\lang\Long.java
まず、パッケージ図はこれです。Longはこの範囲のpackageに収まっています。
Integerと比較すると「math」パッケージが増えているのが、気になるところです。
次にクラス図です。
元の図は大きいので小さく切り取って、見てみます。
2.12.2. 継承¶
継承はIntegerと基本は同じになっていますね。
Numberクラスを継承していました。Longは整数を表すので数として共通のNumberクラスの継承なのでしょう。
Comparableを実現しています。整数は大小比較ができるので、比較メソッド「+compareTo(anotherInteger:Long):long」を実現します。
2.12.3. フィールド¶
Integerと比べると、最大値と最小値の範囲が大きくなっています。
+MIN_VALUE:long=0x8000000000000000L{readOnly}
+MAX_VALUE:long=0x7fffffffffffffffL{readOnly}
サイズもlongなので64になっています。
+SIZE:int=64{readOnly}
2.12.4. メソッド¶
toXXXがlongを文字列へ変換数処理になっています。
「+toHexString(i:long):String」のように16進数文字列に変えたりもできます。
この辺は文字列で数値を受け取ってLongへ変換しています。
parseXXXは文字列解析(parse)してlongにします。
この辺は、コンストラクタでね。longかStringを引数に貰って、インスタンスを生成します。
この辺では、longをbyteやintなど他の整数型や、float、doubleの浮動小数型に変換しています。
数値の大小の比較関連のメソッドです。
このへんは、ビット演算関連です。
「+rotateLeft(i:long,distance:int):long」左ローテートなども用意されています。
この辺は、合計、最大値、最小値の取得計算です。
2.12.5. 関連、内部クラス、例外¶
関連、内部クラス、例外等です。
関連は「+TYPE:Class<Long>」を持っています。
Integerにもありましたが、これは、自分のクラス型を静的フィールドTYPEに持っています。
内部クラスとしては「LongCache」を持っています。
この辺りはIntegerと同じ設計方針ですね。
これは、キャッシュ処理を別クラスに分離しています。
キャッシュ処理とは、よく使うものや一度使ったものを取っておいて再利用する仕組みです。
ここでは、Longのインスタンスをlong型と同じように使うためにキャッシュを利用してます。
メソッド「+valueOf(l:long):Long」での処理でlongからLongへの変換時にキャッシュされたLong型を返します。
こうすることで「==」演算してもlongと同じように扱えます。
※ふつうはインスタンスを「==」で比較してもアドレスが違うと同じにならないので、その対策のようです。 設計する人は色々、考えてますね。
※とはいっても、すべてキャッシュするとえらいメモリーを食いますので通常は「-128~127」の範囲だそうです。 キャッシュも完ぺきではないので、「.equals()」メソッドで比較しましょう。
throws例外は、「NumberFormatException」を発生させます。
「+parseLong(s:String):long」の処理で渡された文字列が数値として変な時に「数のフォーマット」が変だよとこれを例外に投げます。
2.12.6. まとめ¶
Longはだいたい、Integerと同じような作りになっていました。
それにしてもクラス内にビット演算など、一式の整数操作のメソッドが用意されているので、中身をみてみると面白かったです。
追伸:
mathパッケージは「-toUnsignedBigInteger(i:long):BigInteger」の処理で使われていました。
BigIntegerはmath内のクラスで、longより大きな整数が扱うためのものです。