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.
// 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";
}
+ をStringBuilder に置き換えてくれたまでは良かった。a と b は最適化されて一つの ab になったけど c と d はそのままだ。この最適化が有効なのは、業務のソースなんかでたまに見かける
String sql = "SELECT "
+ " * "
+ " FROM "
+ " USER_MST"
+ " WHERE "
+ " BAR = ?";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, "baz");
こんなソースの場合だと思うんだけど、テーブル名なんかを変数に持ってて
String sql = "SELECT "
+ " * "
+ " FROM "
+ " " + tableName
+ " WHERE "
+ " BAR = ?";
こんな事しちゃうと、変数以降の最適化が StringBuilder での最適化に止まってしまう。まぁよく見るよね。こういうコード。
String s1 = (new StringBuilder()).append("SELECT * FROM ").append(s).append(" WHERE ").append(" BAR = ?").toString();
PreparedStatement preparedstatement = connection.prepareStatement(s1);
preparedstatement.setString(1, "baz");
しばらく「最近のJavaはconstなStringを結合して最適化する」っていうのはやめておこうと思った。