public class foo {コンパイルしてデコンパイル
final static String bar = "a" + "b";
public foo() { }
public String bar(String baz) {
return "a" + "b" + baz + "c" + "d";
}
}
# javac -version
javac 1.6.0_24
# javac foo.java
# jad foo.class
// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.+ をStringBuilder に置き換えてくれたまでは良かった。a と b は最適化されて一つの ab になったけど c と d はそのままだ。
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3)
// Source File Name: foo.java
public class foo
{
public foo()
{
}
public String bar(String s)
{
return (new StringBuilder()).append("ab").append(s).append("c").append("d").toString();
}
static final String bar = "ab";
}
この最適化が有効なのは、業務のソースなんかでたまに見かける
String sql = "SELECT "こんなソースの場合だと思うんだけど、テーブル名なんかを変数に持ってて
+ " * "
+ " FROM "
+ " USER_MST"
+ " WHERE "
+ " BAR = ?";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, "baz");
String sql = "SELECT "こんな事しちゃうと、変数以降の最適化が StringBuilder での最適化に止まってしまう。まぁよく見るよね。こういうコード。
+ " * "
+ " FROM "
+ " " + tableName
+ " WHERE "
+ " BAR = ?";
String s1 = (new StringBuilder()).append("SELECT * FROM ").append(s).append(" WHERE ").append(" BAR = ?").toString();しばらく「最近のJavaはconstなStringを結合して最適化する」っていうのはやめておこうと思った。
PreparedStatement preparedstatement = connection.prepareStatement(s1);
preparedstatement.setString(1, "baz");



![Validate my RSS feed [Valid RSS]](http://mattn.kaoriya.net/images/valid-rss-rogers.png)

