今回は前回「コレクションフレームワークを拡張する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)。
クラス | 説明 | |
---|---|---|
StringUtils | java.lang.Stringに関するユーティリティメソッドを集めたクラス | |
NumberUtils | java.lang.Numberに関するユーティリティメソッドを集めたクラス | |
ObjectUtils | java.lang.Objectに関するユーティリティメソッドを集めたクラス | |
SystemUtils | Javaのシステムプロパティを定義するユーティリティクラス |
java.lang.Stringに関するユーティリティ「StringUtils」
StringUtilsはjava.lang.Stringに関するstaticなユーティリティメソッドを集めたユーティリティクラスです。StringUtilsが持っているメソッドのうち代表的なものを表2に示します。
メソッド名 | 説明 | |
---|---|---|
split | 指定された文字列を指定された区切り文字で分割する | |
join | 指定された複数のオブジェクトの文字列表現を指定された区切り文字を挟んで連結する | |
center | 指定された文字列をセンタリングする | |
chopNewline | 文字列の末尾に改行コード(\nもしくは\r\n)があれば取り除く | |
escape | 指定された文字列をJavaの文字列リテラル表記になるよう変換する | |
repeat | 指定された文字列を指定された個数分つなげたものを返す | |
trim | 指定された文字列の先頭と末尾から空白文字を取り除く | |
upperCase | 指定された文字列中の小文字をすべて大文字にする | |
lowerCase | 指定された文字列中の大文字をすべて小文字にする | |
capitalizeAllWords | 指定された文字列中のそれぞれの単語の先頭を大文字にする | |
isNumeric | 指定された文字列が数字だけを含むかを返す | |
defaultString | 指定された文字列をそのまま返すが、nullの場合は指定されたデフォルト文字列を返す | |
reverse | 指定された文字列を反転した文字列を返す |
splitメソッドは文字列を手軽に分割するのに用いることができます。また、いくつまで分割するかの上限を指定することもできます。例えばStringUtils.split("a/b/cd/e", "/", 3)を実行すると“a”、“b”、“cd/e”の3つの文字列を要素として持つ配列が返されます。
joinメソッドを用いると手軽に文字列を連結することができます。例えばStringUtils.join(new String[]{ "a", "b", "cd" }, "/")を実行すると“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に示します。
メソッド名 | 説明 | |
---|---|---|
StringToInt | 指定された文字列を数値に変換する | |
createNumber | Javaの数値リテラル表記からjava.lang.Numberオブジェクトを生成する | |
isDigits | 指定された文字列が数字だけを含むかどうかを返す | |
isNumber | 指定された文字列が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であれば引数に指定されたデフォルトオブジェクトを返します。例えばObjectUtils.defaultIfNull(obj, "default")とすると、objがnullでなければobj自身を返し、nullであれば文字列“default”を返します。
equalsメソッドはObject#equals()メソッドと同じように2つのオブジェクトが等しいかどうかを返しますが、オブジェクトがnullである場合でも比較ができる点でObject#equals()メソッドと異なります。
identityToStringメソッドは、toStringメソッドをオーバライドしてしまっているようなクラスのオブジェクトについて、もともとのObject#toString()メソッドの出力と同じ文字列を返します。例えばリスト1のようなクラスのオブジェクトobj = new Sample("test")について、obj.toString()を実行すると結果は“test”となりますが、ObjectUtils.identityToString(obj)を実行すると結果は例えば“Sample@1172e08”のようになります。
public class Sample { private String status_; public Sample(String status) { status_ = status; } public String toString() { return status_; } }
システムプロパティを定数として定義するユーティリティクラス「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)を参照してください。
定数名 | 説明 | |
---|---|---|
FILE_SEPARATOR | System.getProperty("file.separator")の値 | |
JAVA_VERSION | System.getProperty("java.version")の値 | |
LINE_SEPARATOR | System.getProperty("line.separator")の値 | |
OS_ARCH | System.getProperty("os.arch")の値 | |
OS_NAME | System.getProperty("os.name")の値 | |
PATH_SEPARATOR | System.getProperty("path.separator")の値 |
今回はLangをご紹介しました。ここではLangが持つクラスやメソッドのごく一部しかご紹介できませんでしたが、LangもCollectionsと同様、有用なクラスや便利なメソッドを数多く持っていますので、ぜひ一度Javadocに目を通してみてください。きっと「かゆいところに手が届く」ようなクラスやメソッドを発見できると思います。
次回は、ログ出力を柔軟に実装できるCommonsのloggingを解説します。
筆者プロフィール
横田健彦(よこた たけひこ)
東京工業大学卒業後、(株)東芝に入社。現在、知識メディアラボラトリーにてコミュニティベース情報共有システムの研究に従事。小学校のころからコンピュータに触れ、主にゲームプログラミングを通してBASIC、アセンブラをはじめとする多数の言語を学ぶ。JavaではJakartaプロジェクトの成果物を利用していく中で主にWebアプリケーションプログラミングの面白さに引かれ、Ja-Jakartaプロジェクトの活動に貢献する一方でオープンソースのJavaベースのWebコンテンツ管理システムであるKvasir/Soraの開発を行っている。
Copyright © ITmedia, Inc. All Rights Reserved.