研究開発センター]今回は前回「コレクションフレームワークを拡張するCollections」で紹介したCollectionsと同様に、ユーティリティ色が強いコンポーネントであるLangを紹介します。java.langのための拡張機能を提供する「Lang」CommonsのLangコンポーネントはjava.langパッケージに属するクラスにさらなる機能性を与えるようなユーティリティクラス群です。この原稿の執筆時点での最新バージョンは1.0.1です。LangはCollectionsコンポーネントと同様かなり多くのクラスを持っているため、ここですべてのクラスについて詳細に説明することはできません。そこで利用頻度が高いものや知っておくと便利なものをいくつかピックアップして説明することにします。Langが持つクラスの詳細について知りたい方はJakartaのLangのWebページ(http://jakarta.apache.org/commons/lang.html)を参照してください。ここではLangが持つクラスのうち、org.apache.commons.langパッケージに属するクラスのいくつかを紹介します(表1)。Javaのシステムプロパティを定義するユーティリティクラスjava.lang.Stringに関するユーティリティ「StringUtils」StringUtilsはjava.lang.Stringに関するstaticなユーティリティメソッドを集めたユーティリティクラスです。StringUtilsが持っているメソッドのうち代表的なものを表2に示します。指定された文字列を反転した文字列を返すsplitメソッドは文字列を手軽に分割するのに用いることができます。いくつまで分割するかの上限を指定することもできます。3)を実行すると“a”、“b”、“cd/e”の3つの文字列を要素として持つ配列が返されます。joinメソッドを用いると手軽に文字列を連結することができます。"/")を実行すると“a/b/cd”という文字列が返されます。centerメソッドは指定された文字列を指定された幅に対してセンタリングします。このとき空白でパディングされますが、パディング文字列を指定することもできます。同様のメソッドとして左の空白をパディングするためのleftPadや右の空白をパディングするためのrightPadもあります。chopNewlineメソッドはPerlのchompと同じ働きをします。StringUtilsにもchompという名前のメソッドがありますが、これはPerlのchompとは異なり「一番末尾寄りにある\nとそれ以降の文字列を取り除く」というメソッドなので注意してください。Langのバージョン1.0.1ではchopNewlineメソッドに長さ0の文字列を与えるとjava.lang.StringIndexOutOfBoundsExceptionがスローされてしまうようです。escapeメソッドは指定された文字列をJavaの文字列リテラル(定数文字列)表記になるよう\記号を用いてエスケープします。文字列中のタブ記号は\tに変換されます。漢字などのいわゆるマルチバイト文字は\uXXXXの形式に変換されます。trimメソッドは指定された文字列の先頭と末尾から空白文字を取り除きます。java.lang.String#trim()メソッドと異なるのは、StringUtilsのtrimメソッドにnullを引数として渡すことができる点です。nullを引数として渡した場合メソッドの返り値はnullになります。trimメソッドに似たメソッドとしてstripというのもあります。stripメソッドにはいろいろな類似メソッドがあり、例えば引数を2つ持つstripメソッドは空白文字の代わりに第2引数として指定した文字列に含まれる文字を取り除きます。複数の文字列に対してまとめてstrip処理を行うstripAll、文字列の先頭だけから空白文字を取り除くstripStart、文字列の末尾だけから空白文字を取り除くstripEndがあります。upperCase、lowerCaseメソッドはそれぞれjava.lang.StringのtoUpperCaseメソッド、toLowerCaseメソッドと基本的には同じですが、nullを引数として渡すことができる点が異なります。このほかにも、StringUtilsにはnullを引数として渡すことのできるメソッドがいくつかあります。それらのメソッドを使えば、文字列がnullかどうか判定して条件分岐させる手間を省くことができます。java.lang.Numberに関するユーティリティ「NumberUtils」NumberUtilsはjava.lang.Numberに関するstaticなユーティリティメソッドを集めたユーティリティクラスです。NumberUtilsが持っているメソッドのうち代表的なものを表3に示します。指定された文字列がJavaの数値リテラル表記かどうかを返すStringToIntメソッドは指定された文字列を数値に変換します。変換に失敗した場合は指定されたデフォルトの数値を返します。createNumberメソッドは数値を表す文字列から数値オブジェクトを生成します。数値を表す文字列としてはJavaの数値リテラル表記を指定するようになっており、指定された表記に従った数値オブジェクトを生成します。NumberUtils.createNumber("1.2e-2f")を実行すると、java.lang.Float型のオブジェクト(値は0.012)を生成して返します。isDigitsメソッドは指定された文字列が数字だけを含むかどうかを返します。NumberUtils.isDigits("123")はtrueを返します。これに対してNumberUtils.isDigits("-1")では数字でないマイナス記号を含んでいるのでfalseを返します。StringUtilsにも似たメソッドとしてisNumericというメソッドがありましたが、isDigistsメソッドとisNumericメソッドとの違いは、isNumericメソッドでは空文字列を与えるとtrueを返すのに対してisDigitsメソッドではfalseを返すという点です。isNumberメソッドは指定された文字列がJavaの数値リテラル表記かどうかを返します。NumberUtils.isNumber("-1")やNumberUtils.isNumber("1.2e-2f")はtrueを返します。java.lang.Objectに関するユーティリティ「ObjectUtils」ObjectUtilsはjava.lang.Objectに関するstaticなユーティリティメソッドを集めたユーティリティクラスです。このクラスは現在のところdefaultIfNull、equals、identityToStringの3つしかメソッドを持っていません。defaultIfNullメソッドは指定されたオブジェクトがnullでなければそれ自身を返します。nullであれば引数に指定されたデフォルトオブジェクトを返します。"default")とすると、objがnullでなければobj自身を返し、nullであれば文字列“default”を返します。equalsメソッドはObject#equals()メソッドと同じように2つのオブジェクトが等しいかどうかを返しますが、オブジェクトがnullである場合でも比較ができる点でObject#equals()メソッドと異なります。identityToStringメソッドは、toStringメソッドをオーバライドしてしまっているようなクラスのオブジェクトについて、もともとのObject#toString()メソッドの出力と同じ文字列を返します。Sample("test")について、obj.toString()を実行すると結果は“test”となりますが、ObjectUtils.identityToString(obj)を実行すると結果は例えば“Sample@1172e08”のようになります。}}システムプロパティを定数として定義するユーティリティクラス「SystemUtils」SystemUtilsはjava.lang.System#getProperty()メソッドで取得できるようなシステムプロパティを定数として定義するユーティリティクラスです。このクラスでは定数は数多く定義されていますが、その一方でこのメソッドにはJavaのバージョンをfloat型で返すgetJavaVersionメソッドと、Javaのバージョンが指定されたバージョン以上であるかどうかを返すisJavaVersionAtLeastメソッドの2つしかありません。SystemUtilsで定義されている定数の例を表4に挙げておきます。詳しくはSystemUtilsクラスのJavadoc(http://jakarta.apache.org/commons/lang/api/org/apache/commons/lang/StringUtils.html)を参照してください。今回はLangをご紹介しました。ここではLangが持つクラスやメソッドのごく一部しかご紹介できませんでしたが、LangもCollectionsと同様、有用なクラスや便利なメソッドを数多く持っていますので、ぜひ一度Javadocに目を通してみてください。「かゆいところに手が届く」ようなクラスやメソッドを発見できると思います。次回は、ログ出力を柔軟に実装できるCommonsのloggingを解説します。現在、知識メディアラボラトリーにてコミュニティベース情報共有システムの研究に従事。小学校のころからコンピュータに触れ、主にゲームプログラミングを通してBASIC、アセンブラをはじめとする多数の言語を学ぶ。JavaではJakartaプロジェクトの成果物を利用していく中で主にWebアプリケーションプログラミングの面白さに引かれ、Ja-Jakartaプロジェクトの活動に貢献する一方でオープンソースのJavaベースのWebコンテンツ管理システムであるKvasir/Soraの開発を行っている。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。