java.langの機能を拡張するLang現場に活かすJakarta Project(8)

» 2003年07月04日 00時00分 公開
[横田健彦(株)東芝 研究開発センター]

 今回は前回「コレクションフレームワークを拡張する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)。

表1 org.apache.commons.langパッケージに属するクラス
クラス 説明
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に示します。

表2 StringUtilsクラスの代表的なメソッド
メソッド名 説明
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に示します。

表3 NumberUtilsクラスの代表的なメソッド
メソッド名 説明
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”のようになります。

リスト1 toStringメソッドをオーバーライドするようなクラスの例
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)を参照してください。

表4 SystemUtilsクラスで定義されている定数の例
定数名 説明
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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。