Javaコンパイラによるconst文字列の結合について

知人のTweetより。
Big Sky :: 最近のjavaコンパイラはconstなStringを結合して最適化...しない によると

    public String bar(String baz) {
        return "a" + "b" + baz + "c" + "d";
    }

コンパイルしてデコンパイル

    public String bar(String s)
    {
        return (new StringBuilder()).append("ab").append(s).append("c").append("d").toString();
    }

+ をStringBuilder に置き換えてくれたまでは良かった。a と b は最適化されて一つの ab になったけど c と d はそのままだ。

ということだそうだ。


僕はjadをマシンに入れてないのでjavapでバイトコード見てみたのだけどたしかにそうなっている。
しかしこれをたとえば

        return "a" + "b" + baz + ("c" + "d");

のようにすればjavac(1.6.0_22)は

        return (new StringBuilder()).append("ab").append(s).append("cd").toString();

に相当するバイトコードを出力する。


「baz + "c" + "d"」と「baz + ("c" + "d")」ではStringに対する連結の順序が異なるのだが、それを嫌って最適化しないということなのかもしれない。でもこのような場合に連結の順序が変わることによって異なる挙動になって不味くなるような例が存在するのだろうか? しばらく考えただけでは思いつかないんだけど。