2.13. java.lang.Integer。根源的な型int用のクラス。

2.13.1. クラス図にしてみる

int型を使わない人はいないですよね。ですので、まず始めはintをクラスにしたIntegerを解析してみました。

UML変換くんを実行。

> touml .\java\lang\Integer.java

パッケージ図はこれです。Integerはこの範囲のpackageに収まっています。

../_images/integer.package.png

次にクラス図です。

../_images/java.lang.svg

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

2.13.2. 継承

まずは、継承を見ています。

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

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

../_images/java.lang.integer.inheritance.png

2.13.3. フィールド

次はフィールドを見てみます。

目についたところでは最大値と最小値を16進数の定数で定義しています。

面白いところでは、「~DigitOnes:char[]={'0','1','2','3','4'...」のように、数字を文字として宣言してます。中で数値を文字列に変換するときに使います。

../_images/java.lang.integer.field.png

2.13.4. メソッド

次はメソッドです。

この辺は引数に文字列を渡されて、intに変換しています。

../_images/java.lang.integer.method.png

この辺は、数値の比較をしています。

../_images/java.lang.integer.method1.png

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

../_images/java.lang.integer.other.png

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

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

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

../_images/java.lang.integer.inner.png

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

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

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

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

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

こうすることで「==」演算してもintと同じようになります。

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

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

../_images/java.lang.integer.throws.png

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

2.13.6. まとめ

Integerクラスも改めてクラス図にして眺めてみるといろいろ発見があります。こんな感じで他のソースコードも眺めていきます。