前回は commons-beanutils の基本的な使い方を見ました。 今回は、前回の最後の方に出てきたユーティリティ・クラス ConvertUtils のメソッド Object convert(String, Class<?>) の振る舞いを見ていきます*1。
このメソッドの使用目的は第1引数の文字列を第2引数のクラスで指定される型へ変換(convert)することです。 例えば、
ConvertUtils.convert("true", Boolean.class);
とすると、Boolean 型のオブジェクト Boolean.TRUE が返されます。
デフォルトで第2引数に指定できるクラスは
- java.math.BigDecimal
- java.math.BigInteger
- boolean and java.lang.Boolean
- byte and java.lang.Byte
- char and java.lang.Character
- java.lang.Class
- double and java.lang.Double
- float and java.lang.Float
- int and java.lang.Integer
- long and java.lang.Long
- short and java.lang.Short
- java.lang.String
- java.io.File
- java.net.URL
- java.sql.Date
- java.sql.Time
- java.sql.Timestamp
でした*2。 以下で幾つかを見ていきましょう。 ただし、
- java.lang.String はそのままなので省略。
- byte, short, char とそのラッパ型は省略*3。
- java.lang.Class は Class.forName(String) と(たぶん)同じなので省略。
- java.io.File, java.net.URL, java.math.BigInteger, java.math.BinDecimal は普通に使う分には、直感的な使い方そのままなので省略。
boolean ★ java.lang.Boolean
これは boolean リテラルをそのまま文字列にしたものです。
- "true" → Boolean.TRUE
- "false" → Boolean.FALSE
ただし、大文字、小文字が混ざっていてもいいようです。 例えば、"TRUE", "truE" などもきちんと変換されます。 また、文字列を解析できなければ、Boolean.FALSE が返されます*4。
int ★ java.lang.Integer
Java の言語仕様に載ってた int リテラルを試してみるとこんな感じでした(右側の数字は、返り値のオブジェクトに対して toString() メソッドを呼び出した結果です):
- 0 → 0
- 2 → 2
- 0372 → 372
- 0xDadaCafe → 0
- 1996 → 1996
- 0x00FF00FF → 0
最初の "0" は無視されるようです(Java では8進数とみなされる)。 また、"0x" から始まると(Java では16進数とみなされる)文字列の解析に失敗したと見なされます。 文字列の解析に失敗した場合、0 が返されます。
long ★ java.lang.Long
int リテラルの場合と同様に、long リテラルの場合は
- 1 → 1
- 00l → 0
- 0777 → 777
- 0777L → 0
- 0x100000000L → 0
- 0xC0B0L → 0
Java の long リテラルと違って、最後に "L", "l" がついていると、文字列の解析に失敗したと見なされます。 その他は int の場合と同じです。
float ★ java.lang.Float
float リテラルの場合。
- 1e1f → 10.0
- 2.f → 2.0
- .3f → 0.3
- 0f → 0.0
- 3.14F → 3.14
- 6.022137e+23f → 6.022137E23
long リテラルの場合と違って、末尾の "F", "f" は認識されます。 また、指数部を付加したフォーマットも認識されます。
double ★ java.lang.Double
double リテラルの場合。 だいたい float リテラルの場合と同様です。 末尾に "D", "d" をつけていてもきちんと認識されます。
- 1e1 → 10.0
- 2. → 2.0
- .3 → 0.3
- 0 → 0.0
- 3.14 → 3.14
- 1e-9d → 1.0E-9
- 1e137 → 1.0E137
java.sql.Data ★ java.sql.Time ★ java.sql.Timestamp
ここでは無愛想なフォーマットとサンプルだけを載せておきます:
Java クラス | フォーマット | サンプル文字列 |
---|---|---|
java.sql.Data | yyyy-mm-dd | "1970-01-01" |
java.sql.Time | hh:mm:ss | "12:34:56" |
java.sql.Timestamp | yyyy-mm-dd hh:mm:ss.nnn | "1970-01-02 19:17:36.789" |