2009-11-07

StringBuffer, StringBuilder の落とし穴?


  1. AyakoBaba
    AyakoBaba Sbにnullをappendすると"null"になる巧妙なわな
-- this quote was brought to you by quoteurl
というつぶやきを見て気になったので自分自身でも検証コードを書いて試してみた。
public class SbTest {
    public static void main(String[] args) {
        String foo = "foo";
        String bar = null;
        String baz = "baz";

        StringBuilder sb1 = new StringBuilder();
        sb1.append(foo);
        sb1.append(bar);
        sb1.append(baz);
        System.out.println(sb1.toString());

        StringBuffer sb2 = new StringBuffer();
        sb2.append(foo);
        sb2.append(bar);
        sb2.append(baz);
        System.out.println(sb2.toString());
    }
}
これを実行すると…
foonullbaz
foonullbaz
ほんとだ。

それぞれの append() メソッドのソースを見てみると以下のようになっています。
    public synchronized StringBuffer append(String str) {
        super.append(str);
        return this;
    }
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
で、super.append(str) で呼び出されるメソッドのソースはというと…
    public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
null の場合は null という文字列として扱うとなってます。このあたりは思い込みで何も追加されないと思っている人も少なくないと思うので注意が必要ですね。

0 件のコメント:

コメントを投稿