あいだが開いてしまいました!
型としての基本データ型。
へんな章題……。
8.1 共通のフィールドとメソッド
8.1.1 生成
プリミティブ型のラッパークラスは、それが包み込んでいる基本データ型の値に対する不変オブジェクトを定義する。
そのクラスがラップするプリミティブ型を受け取るコンストラクタに加えて、文字列を受け取るコンストラクタもある。
ただし、特に新しいインスタンスが必要とういわけでなければ、コンストラクタを直接呼んで値を生成するのではなく、valueOfメソッドを使用すべき。
8.1.2 定数
Booleanを除く各ラッパークラスは、次の3つのフィールドを定義している。
- MIN_VALUE
- MAX_VALUE
- SIZE
また、すべてのラッパークラスは、次のフィールドを定義している。
- TYPE
8.1.3 共通のメソッド
type parseType(String str)とString toString(type value)、楽ちん!
8.2 Void
「void.classを使用して得られるClassオブジェクトへの参照を保持しているstaticのTYPEフィールドだけを持って」いるクラス。
リフレクションでのみ使用される……らしい。わけわかめ。リフレクションの説明まで、おあずけ。
8.3 Boolean
BooleanクラスはBoolean.TRUEとBoolean.FALSEを持つ。
使用できる場面がBoolean.valueOf(true)とBoolean.valueOf(false)と完全に一致する気がするけど、どちらを使う方がいいのでしょうか……。(どっちでもいい?)
8.4 Number
typeValue()メソッドが宣言されている抽象クラス。
各サブクラスのtypeValue()メソッドは、明示的なキャストと同様の動作をする。
8.4.1 整数ラッパー
整数ラッパーには、基数を受け取るparseType()メソッドとvalueOf()メソッドが備わっている。その他、類似のメソッドがいくつか。あと、ビット関連の問い合わせ/操作メソッドもやたら充実している。
8.4.2 浮動小数点ラッパークラス
前項とのタイトルの非対称性が気になる。(プログラマっぽい発言)
floatおよびdoubleにおけるNaN != NaN、理屈わかるようでイマイチわからないけど、とりあえずカッコいいと思う。NaNかどうかの検査はisNaN()で行う。
が。ラッパークラスFloatとDoubleにおいては、「すべてのNaNはお互いに等しい」らしい。わけがわからないよ!
それから、parseFloat()メソッドおよびparseDouble()メソッドにおいては、「整数ラッパークラスと違い、先頭と最後の空白は最初に取り除かれ」るらしい。なんでや!
int / longのビットパターンとfloat / doubleとをやりとりするメソッドもある。ビット関連の謎の充実っぷり……。
8.5 Character
Unicodeの世界では、このようにすることで(確実に)大文字小文字の違いを無視した文字列比較を行うことができる。らしい。
Character.toUpperCase(Character.toLowerCase(ch));
ううむ……。
8.5.1 UTF-16を扱う
未曾有の眠みが襲う!UTF-16をさっぱり知らないせいであると思われる。
プログラマの基礎教養でもあるはずなので、いい加減文字コードやっとこうと思う。
お手軽なところで、とりあえずこの辺からかしら。
8.6 ボクシング変換
基本データ型の変数をそのラッパークラス のインスタンスに自動的に変換することをボクシング変換という。
対称的に、ラッパークラスのインスタンスから基本データ型の値への変換をアンボクシング変換という。
変換はいろいろなところで暗黙に行われるけど、特にボクシング変換ではその都度インスタンスが生成されたりとかしかねないので、明示的にvalueOf()を呼ぶのが良い習慣なのでは?と思う。(そこまではっきりとは書かれてない)
ただ、一定の範囲の値(intなら-128から127までとか)については、ボクシング変換時に唯一のオブジェクトを使用するように言語仕様で定められているらしいし、仮想マシンの実装ではそれ以上の最適化を行ってもいいらしいので、あんま気にしなくてもいい……のかもしれない。
第8章おしまい!
読み終わったら「型としての基本データ型」という章題の意味がわかるかと思いきや、わからず。がっくし……。
そういえば、『プログラミング言語Java』読了の目標は10月いっぱいです。
しかし、うーむ、かなり厳しい気がしてきました。ペースを5倍(!!)に上げないと。
並列化……はちょっと難しいので、アルゴリズムを改善するしかないかな。