2011/03/06

Recent entries from same category

  1. 業務プログラマが書くJava
  2. 暇だったのでanarcy goldなんかしてみた。

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を結合して最適化する」っていうのはやめておこうと思った。
Posted at by | Edit


blog comments powered by Disqus