タグ

ブックマーク / unageanu.hatenablog.com (11)

  • 「+」演算子での文字列連結は、コンパイラでStringBuilder#append()にされるよ! - うなの日記

    文字列をちょこっと連結したい時に、いちいちStringBuilderを使うのは面倒くさいですよねー。 というか、「+」で連結しても実はコンパイラがうまいこと最適化してくれるんじゃね?とふと思い立って調べて見ました。 結論:単純な連結なら、コンパイラがちゃんとStringBuilderにしてくれます。 ↓のような1ステートメントに収まる単純な文字列連結であれば、コンパイラがちゃんとStringBuilderに変換してくれます。 // リテラルの連結 String a1() { return "a" + "b"; } String a2() { return "a" + "b" + "c"; } String a3() { return "a" + 10; } String a4() { return 10 + "a"; } String a5() { return "a" + 10 + "b

    「+」演算子での文字列連結は、コンパイラでStringBuilder#append()にされるよ! - うなの日記
    Nagise
    Nagise 2010/03/08
    文字列リテラル同士の+連結はコンパイル時に単一のリテラルに変換されることがあるんじゃなかったかな。
  • Java変態?コード最速マスター - うなの日記

    Java変態文法最速マスター - プログラマーの脳みそが面白かった && 参考になったので便乗してリスペクト。変態世間であまり見かけない(かも知れない)Javaコードを、過去のエントリからまとめてみました。 nullでなければループ 「配列がnullでなければループ」というシーンはまれにありますが、nullチェックのためにインデントが深くなるのが我慢ならん、というときにこういう記述はどうでしょう。 String[] strs = // 略 // 配列がnullでなければ各要素に対して処理を実行 if ( strs != null ) for ( String str : strs ) { // 処理 } if文の「{}」を省略してforを繋げているだけですが、インデントをさりげなく削れます。 似たような例で、「例外を無視して次へ」とかも。 // 例外が発生しても無視して次へ for ( S

    Java変態?コード最速マスター - うなの日記
    Nagise
    Nagise 2010/02/04
    この発想はなかった!凄い!
  • Javaメソッドの呼び出し元をツリー表示するスクリプト - うなの日記

    JavaClassを使って指定メソッドの呼び出し元を探索しツリー表示するスクリプトを書いてみました。 引数で指定されたパス以下の*.class,および*.jarに含まれるクラスファイルを解析し、 メソッドの呼び出しコードを収集。 収集した情報を再帰的に探索し、呼び出し元メソッドをツリー形式で出力します。 使い方 $ ./caller.rb <クラスが置かれたディレクトリorJarファイル> <呼び出し元を探すメソッド> 呼び出し元を探すメソッドは「<メソッドが定義されたクラスのFQCN>#<メソッドのディスクリプタ表記>」で指定します。具体的には以下のような形になります。 java.Util.ArrayList#indexOf(Ljava/lang/Object;)I クラスが置かれたディレクトリ or Jarファイルは、「;」区切りで複数指定可能です。 具体例 ↓のようなクラスがあったと

    Javaメソッドの呼び出し元をツリー表示するスクリプト - うなの日記
  • 指定パッケージ内のクラス一覧を取得するサンプル - うなの日記

    1.6より追加されたStandardJavaFileManagerを使用して、指定パッケージ内のクラス一覧を取得するサンプルです。 import javax.tools.DiagnosticCollector; import javax.tools.JavaCompiler; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.StandardLocation; import javax.tools.ToolProvider; ... JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); JavaFileManager fm = compiler.getStandardFileManager(

    指定パッケージ内のクラス一覧を取得するサンプル - うなの日記
    Nagise
    Nagise 2010/01/08
    tools.jarを必要とするあたり、用途が限られるな
  • 最近の流行 - うなの日記

    以下のような書き方が個人的に流行中。 String[] strs = // 略 // 配列がnullでなければ各要素に対して処理を実行 if ( strs != null ) for ( String str : strs ) { // 処理 } forで列挙する対象がMap.Entryとかになると、Genericsもあって行がすぐに長くなってしまうのが難点。んー、定着するかは微妙だな。

    最近の流行 - うなの日記
    Nagise
    Nagise 2009/08/20
    というか、拡張for文はnull値のときにNullPointerExceptionじゃなくてループを抜ける仕様にしてくれてたらよかったのに。
  • アスペクトを織り込むユーティリティを書いた。 - うなの日記

    となりのチームのプロジェクト炎上気味でついに出稼ぎに出る羽目になったわけですが、そのプロジェクトではGuiceもSpringもSeasarも使ってないので、アスペクトがさくっと使えない。リリースも近いし、今からモジュール追加するのもメンドウだなー、セットアップのモジュール管理表の締め切りすぎてるしー、ということでアスペクトを織り込むユーティリティを書いてみた。 java.lang.reflect.Proxyを利用して、簡単なメソッドインターセプターを実現します。 Javaの標準クラスだけあれば使えます。依存モジュールなし。 ただし、以下の制限があります。 インターフェイスを実装したオブジェクトにのみ、インターセプターを適用できます。 インターセプター適用済みオブジェクトは、元のオブジェクト型にはキャストできません。元のオブジェクトが実装するインターフェイス型にのみキャスト可能です。 オブ

    アスペクトを織り込むユーティリティを書いた。 - うなの日記
    Nagise
    Nagise 2009/08/03
    OOP世界でアスペクト指向する場合の定番Proxyクラス。インターフェースじゃないとだめなのが玉に傷。
  • 昔書いたコード - うなの日記

    昔書いたコードを発見。interface内でどうしてもstaticブロックが使いたかったようだ。 public interface Foo { ...略 /** 必要なシステムプロパティを設定。*/ Object INIT = new Object(){{ System.setProperty( "foo", "var" ); }}; } 我ながら、一瞬何がしたいんだこれ、と思ってしまった・・。ネタ的にはこれに近いかな。

    昔書いたコード - うなの日記
    Nagise
    Nagise 2009/07/02
    苦肉の策だなぁ…
  • キャメルケースを単語に分割する - うなの日記

    キャメルケースを単語に分割したいときには、「ゼロ幅の肯定先読み」を使うとさくっとできます。 // 分割する文字列 String str = "StringIndexOutOfBoundsException"; // 小文字と大文字の間で分割 String[] strs = str.split( "(?<=[a-z])(?=[A-Z])" ); for ( String s : strs) { System.out.println( s ); } 実行結果です。 String Index Out Of Bounds Exception動作としては、 「(?<=[a-z])」が「ゼロ幅の肯定後読み」で、「小文字の後」にマッチ(小文字自体にはマッチしない)。 「(?=[A-Z])」が「ゼロ幅の肯定先読み」で、「大文字の前」にマッチ(大文字自体にはマッチしない)。 なので、「(?<=[a-z])(

    キャメルケースを単語に分割する - うなの日記
    Nagise
    Nagise 2009/04/20
    おぉ。コロンブスの卵。さらに、大文字が複数個繋がるケースも対応できるようにするにはどうしたらよいだろうか?
  • Javaでcallee - うなの日記

    メソッド内の処理でそのメソッド自身への参照を簡単に得る方法。Java5.0以降のみですが、JavaScriptで使えるarguments.calleeみたいなのが簡単に実現できます。 ...まぁ、Class#getMahod()でとれるっちゃーとれるんですが、これだとメソッド名を指定する必要があります。以下の方法はメソッド名を知らなくても現在のメソッドを取得できるのがメリットかな。 メソッド自身への参照を得る 関数にしました。1.5より、無名クラスからそれを定義したMethodの参照がとれるようになったのでそれを使います。 /** * メソッド自身を取得する。 * @param o メソッド内で作成した無名クラス * @return メソッド自身 */ static Method callee( Object o ) { return o.getClass().getEnclosingMe

    Javaでcallee - うなの日記
    Nagise
    Nagise 2009/02/26
    メソッド内のローカルクラス or 匿名クラスの場合にClass#getEnclosingMethod()で宣言されたメソッドを取得できることを利用して現在のMethodを取得するハック。これは面白い
  • EnumMapがどれだけ早いか性能を測ってみた。 - うなの日記

    EnumMapとかいうEnumのみをキーにできるMapがあって、これがEnumの連番を使って高速に動作するらしい。(→Java プログラミング言語 - 列挙型) ということでとりあえず性能を測ってみた。 計測方法 EnumをキーとしたMapのインスタンスをいろいろ作成し、 get、putをそれぞれ500000*26回実行した場合の所要時間を計測。 それぞれ5回試行し、平均を取る。 結果 get put EnumMap 312ms 490ms HashMap 593ms 921ms TreeMap 334ms 1490ms LinkedHashMap 497ms 690ms うん、まぁ、早いかな。> EnumMap。 なお、計測環境のCPUは Pentium D 2.79GHz, JDKは1.6.0_07です。 計測で使用したコード 計測で使用したコードは以下の通り。 // テスト用の列挙型

    EnumMapがどれだけ早いか性能を測ってみた。 - うなの日記
    Nagise
    Nagise 2009/01/15
    キーのオブジェクトがEnumならEnumMapを使えってことだな
  • ハッシュのキーは文字列でいいのか? - うなの日記

    Rubyの文字列は「不変でない」んだよな。ということはハッシュのキーとして使った文字列が外部で変更された場合、ハッシュから値を取り出せなくなる場合があるんだよな、とふと思って検証してみたら違っていた。 # 文字列をキーとしてハッシュを作る。 key = "foo" hash = { key=>"value" } puts key puts hash[key] # => value # キーの値を変更 puts "---" key << "o" puts key puts hash[key] # キーの値が変わっているので取り出せないはず。 puts hash["foo"] # ハッシュ内のキーも更新されているはずなので取り出せないはず。 実行結果です。 foo value --- fooo nil value理由はRubyリファレンスマニュアル - Hashにちゃんと書かれています。 文字

    ハッシュのキーは文字列でいいのか? - うなの日記
    Nagise
    Nagise 2008/11/17
    普遍じゃないオブジェクトをキーとしたとき、同じ参照を得る手段があるなら別に問題にはならない。「文字列」の場合はリテラルとかあってちょっと事情が特殊なんだよな。
  • 1