BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース String から Java オブジェクトへの変換ライブラリのまとめ

String から Java オブジェクトへの変換ライブラリのまとめ

ブックマーク

原文(投稿日:2010/09/07)へのリンク

Joda Timeで有名なStephen Colebourne氏が、アノテーションを使って、基本的なオブジェクトとString 間で変換するライブラリである、Joda Convertをリリースした時に彼のブログで少々議論を巻き起こした。String変換で考慮すべきことを明確にする助けのために、Stringからオブジェクトへの変換、そしてその逆変換のための、いくつかの技術ついて,以下にまとめる。まず、Joda Convertから始める。

Colebourne氏の投稿によれば、Joda Convertの明確な目的は、単純さのために、完全性をトレードオフすることである。そのため、どんなJavaクラスでも、String からそのクラスへの変換とその逆変換を行う、任意の名前のメソッドを指定できる。例えば、Currency クラスは、 "fromISOCode(code)" という名前のスタティック メソッドや"getISOCode()"という名前のインスタンス メソッドを持てる。これらのメソッドに、Joda Convert アノテーションの@FromString と @ToStringを加えることによって、アプリケーションは、 Stringへ/から変換できる、次のように呼べばよい: "Foo bar = StringConvert.INSTANCE.convertFromString(Foo.class, str);"。このような変換は、例えば、HTTP GETから値をパースしなければならない、Webアプリケーションを書いている時に、しばしば役に立つ。 Colebourne氏のブログにコメントした人たちが、他の代替方法をいくつか書いている。

1つ目の代替案は、すでにJavaに組込まれている: java.beans.PropertyEditor。 PropertyEditorは、 JavaBeansの技術を使って、Stringからプロパティ値に変換する。PropertyEditorは、IDEのようなビジュアルなエディタでは、長い歴史がある が、PropertyEditorは、目に見えない処理の中でも使うことができる。例えば、Spring のバージョン3.0の前では、PropertyEditorを縦横に使って 、データ バインディングやデータ バリデーションをサポートしている。Joda Convertと違って、PropertyEditorは、多くの用途を意図していて、単に Stringからオブジェクトへの変換だけではない。例えば、PropertyEditorには、PropertyChangeListenerを登録する機能が組込まれている。

J2EEもまた、JavaServer Facesで独自の組込みの変換技術を持っている。JSFは、 BigDecimal, Float, DateTimeなどのような、一般的な型向けのコンバータを持っている他に、カスタムなコンバータの実装ができるように interfaceも提供している。カスタムな実装は、単に"getAsObject" メソッドと"getAsString" 用のコードを提供すればよい。しかし、JSFコンバータは、JSFと強く結びついているので、JSF外で使うのは、難しいだろう。

組込みのJava Stringコンバータのサードパーティ製の代替品もある。一つは、最近、Spring 3.0に入れられた。Springの以前のバージョンでは、PropertyEditorを使っていたが、 SpringSourceは、Spring 3.0に独自の変換メソッドを実装することにした。SpringSourceによると:

 

Spring 3のデータ バインディング システムを改善することを計画した時の目標は:
1. ステートレスで強い型付けの型変換 API でJavaBeanの PropertyEditorを置き換えるものにする
2. 統一された型変換APIにより、SpringのDataBinder や式言語を含んで、変換が必要なところには、どこにでも使えること
3. 型変換は、Java アノテーション メタデータによって動くこと
4. 意味のあるデフォルトを登録し、「規約は設定に勝る」に従って単純化する

 

SpringSourceだけが自前のタイプ コンバータを持っているオープンソース組織ではない。いくつかの Apacheプロジェクトは、自前のタイプ コンバータを持っており、Apache Commons BeanUtils (Apache Digesterの中で使われている)、現在休眠中の Apache Commons Convert、そしてApache StrutsApache Camelでさえもである。

いくつかのフレームワークは、Stringからオブジェクトへの変換以上のものを行うように設計されている。例えば、Dozer は、任意の複雑なオブジェクトから別の任意の複雑なオブジェクトに変換できる、フレームワークである。Stringは、オブジェクトなので、StringをDozer 変換のどちらの側にも使うことができる。

最後に、変換技術を使う時に、開発者が憶えておくべきなのは、上記のコンバータのそれぞれは、そのターゲット環境に最適化されていることである。例えば、StringがwebブラウザのHTML入力フォームに/から送られる場合とStringがXMLドキュメントに書き込まれるオブジェクトの場合では、違うということである。更に、webブラウザのように同じターゲット環境の場合でさえ、あるユーザは、違うローカリゼーションを使う必要がある(例えば、日付の"2010-31-01" 対 "1/31/2010")。最後になるが、重要なこととして、異なるメディアは、違うString エンコーディングをサポートすることがある、ということである。例えば、XMLドキュメントは、UTF-8、ISO-8859-1 あるいは、他のエンコーディングを使うことができる。それは、一行目にその文字のエンコーディングを指定できるからである。しかし、URLとしてパースされる文字は、ASCIIしか許されない。

この記事に星をつける

おすすめ度
スタイル

BT