DATE : 2006/10/30 (Mon)
java.lang.CharSequence というインタフェースがあります。
このインタフェースは、Java で文字列を表す String クラスや、可変の文字列データの StringBuilder、char 型のデータ列を表す CharBuffer などが実装しており、文字列データを統一して扱えるという点で便利です。
例えば、正規表現を扱う java.util.regex パッケージでは、操作対象として CharSequence を要求します。つまり、String であっても CharBuffer であっても正規表現を使った操作が可能です。
しかし、CharSequence では equals メソッドが定義されていません。つまり、CharSequence 同士で同じ文字列データを表すかどうかを確かめることはできません。
例えば、あるバイト列が特定の文字列を表すかどうかをテストするコードを書いたとします。
// ・string は比較対象の文字列 // ・byteData は、バイト列を表す ByteBuffer オブジェクト // ・encoding は、文字エンコーディングを表す Charset オブジェクト CharBuffer stringData = encoding.decode(byteData); Assert.assertEquals(string, stringData);
「Assert#assertEquals(Object, Object)」は、JUnit の API で、引数に指定されたオブジェクトが同じものかどうか、Object#equals メソッドを使ってテストします。
しかし、例え stringData に正しく string の文字列データが復元できたとしても、このテストは失敗します。
それでは、テストを成功させるためにはどうすれば良いでしょうか。CharSequence には toString メソッドが定義されています。toString メソッドは CharSequence で表される文字列データを String オブジェクトとして返します。すると、以下のようにすればテストは成功します。
CharBuffer stringData = encoding.decode(byteData); Assert.assertEquals(string, stringData.toString());
そのため、CharSequence 同士を比較する際には、toString メソッドを使って String オブジェクトに変換してから比較することになります。