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」パッケージが増えているのが、気になるところです。

../_images/long.package.png

次にクラス図です。

../_images/java.lang.long.svg

元の図は大きいので小さく切り取って、見てみます。

2.12.2. 継承

../_images/java.lang.Long.inheritance.png

継承はIntegerと基本は同じになっていますね。

Numberクラスを継承していました。Longは整数を表すので数として共通のNumberクラスの継承なのでしょう。

Comparableを実現しています。整数は大小比較ができるので、比較メソッド「+compareTo(anotherInteger:Long):long」を実現します。

2.12.3. フィールド

../_images/java.lang.Long.field.png

Integerと比べると、最大値と最小値の範囲が大きくなっています。

+MIN_VALUE:long=0x8000000000000000L{readOnly}

+MAX_VALUE:long=0x7fffffffffffffffL{readOnly}

サイズもlongなので64になっています。

+SIZE:int=64{readOnly}

2.12.4. メソッド

../_images/java.lang.Long.method1.png

toXXXがlongを文字列へ変換数処理になっています。

「+toHexString(i:long):String」のように16進数文字列に変えたりもできます。

../_images/java.lang.Long.method2.png

この辺は文字列で数値を受け取ってLongへ変換しています。

parseXXXは文字列解析(parse)してlongにします。

../_images/java.lang.Long.method3.png

この辺は、コンストラクタでね。longかStringを引数に貰って、インスタンスを生成します。

../_images/java.lang.Long.method4.png

この辺では、longをbyteやintなど他の整数型や、float、doubleの浮動小数型に変換しています。

../_images/java.lang.Long.method5.png

数値の大小の比較関連のメソッドです。

../_images/java.lang.Long.method6.png

このへんは、ビット演算関連です。

「+rotateLeft(i:long,distance:int):long」左ローテートなども用意されています。

../_images/java.lang.Long.method7.png

この辺は、合計、最大値、最小値の取得計算です。

2.12.5. 関連、内部クラス、例外

../_images/java.lang.Long.other.png

関連、内部クラス、例外等です。

関連は「+TYPE:Class<Long>」を持っています。

Integerにもありましたが、これは、自分のクラス型を静的フィールドTYPEに持っています。

../_images/java.lang.Long.inner.png

内部クラスとしては「LongCache」を持っています。

この辺りはIntegerと同じ設計方針ですね。

これは、キャッシュ処理を別クラスに分離しています。

キャッシュ処理とは、よく使うものや一度使ったものを取っておいて再利用する仕組みです。

ここでは、Longのインスタンスをlong型と同じように使うためにキャッシュを利用してます。

メソッド「+valueOf(l:long):Long」での処理でlongからLongへの変換時にキャッシュされたLong型を返します。

こうすることで「==」演算してもlongと同じように扱えます。

※ふつうはインスタンスを「==」で比較してもアドレスが違うと同じにならないので、その対策のようです。 設計する人は色々、考えてますね。

※とはいっても、すべてキャッシュするとえらいメモリーを食いますので通常は「-128~127」の範囲だそうです。 キャッシュも完ぺきではないので、「.equals()」メソッドで比較しましょう。

../_images/java.lang.Long.throws.png

throws例外は、「NumberFormatException」を発生させます。

「+parseLong(s:String):long」の処理で渡された文字列が数値として変な時に「数のフォーマット」が変だよとこれを例外に投げます。

2.12.6. まとめ

Longはだいたい、Integerと同じような作りになっていました。

それにしてもクラス内にビット演算など、一式の整数操作のメソッドが用意されているので、中身をみてみると面白かったです。

追伸:

mathパッケージは「-toUnsignedBigInteger(i:long):BigInteger」の処理で使われていました。

BigIntegerはmath内のクラスで、longより大きな整数が扱うためのものです。