2.13. java.lang.Integer。根源的な型int用のクラス。¶
2.13.1. クラス図にしてみる¶
int型を使わない人はいないですよね。ですので、まず始めはintをクラスにしたIntegerを解析してみました。
UML変換くんを実行。
> touml .\java\lang\Integer.java
パッケージ図はこれです。Integerはこの範囲のpackageに収まっています。
次にクラス図です。
元の図は大きいので小さく切り取って、見てみます。
2.13.2. 継承¶
まずは、継承を見ています。
Numberクラスを継承していました。Inegerは整数を表すので数として共通のNumberクラスの継承なのでしょう。
Comparableを実現しています。整数は大小比較ができるので、比較メソッド「+compareTo(anotherInteger:Integer):int」を実現します。
2.13.3. フィールド¶
次はフィールドを見てみます。
目についたところでは最大値と最小値を16進数の定数で定義しています。
面白いところでは、「~DigitOnes:char[]={'0','1','2','3','4'...」のように、数字を文字として宣言してます。中で数値を文字列に変換するときに使います。
2.13.5. 関連、内部クラス、例外¶
次は、関連、内部クラス、例外です。
関連は「+TYPE:Class<Integer>」を持っています。
これは、自分のクラス型を静的フィールドTYPEに持っています。
内部クラスとしては「IntegerCache」を持っています。
これは、キャッシュ処理を別クラスに分離しています。
キャッシュ処理とは、よく使うものや一度使ったものを取っておいて再利用する仕組みです。
ここでは、Integeのインスタンスをint型と同じように使うためにキャッシュを利用してます。
メソッド「+valueOf(i:int):Integer」での処理でintからIntegerへの変換時にキャッシュされたInteger型を返します。
こうすることで「==」演算してもintと同じようになります。
※ふつうはインスタンスを「==」で比較してもアドレスが違うと同じにならないので、その対策のようです。 設計する人は色々、考えてますね。
※とはいっても、すべてキャッシュするとえらいメモリーを食いますので通常は「-128~127」の範囲だそうです。 キャッシュも完ぺきではないので、「.equals()」メソッドで比較しましょう。
throws例外は、「NumberFormatException」を発生させます。「+parseInt(s:String):int」の処理で渡された文字列が数値として変な時に「数のフォーマット」が変だよとこれを例外に投げます。
2.13.6. まとめ¶
Integerクラスも改めてクラス図にして眺めてみるといろいろ発見があります。こんな感じで他のソースコードも眺めていきます。