getEnclosingなんちゃら。

LoggingAPIを使っている皆様におかれましては、ガード節をキチンと記述しておりますでしょうか?


こういうやつですね。

if(LOG.isDebugEnabled()) {
  LOG.debug("hogehoge");
}

毎回記述するのが面倒な上に、コードの見栄えがあまりよろしくありません。
ガード節を書かないと、実行時におかれましては、
最終的にはどこにも出力されない巨大な文字列が、
不思議空間に浮かんでは消え、浮かんでは消えるなどしているかもしれません。


というワケで、コンパイラにガード節を記述して貰えば良いんじゃね?的な事を考えてみた。

  public static void main(String[] args) throws Exception {
    assert debug(new a() {
      public boolean b() {
        // assert する為の真偽値を演算しる。
        return true;
      }
    }, "hoge");
  }
  public static boolean debug(a a, String msg) {
    Class<?> aclazz = a.getClass();
    Class<?> clazz = aclazz.getEnclosingClass();
    Method m = aclazz.getEnclosingMethod();
    System.out.printf("%s - %s [%s]\n", clazz, m, msg);
    return a.b();
  }
  public interface a {
    boolean b();
  }

ここで登場するのが、getEnclosingなんちゃら。
StackTraceElement的な何かを作らなくても、呼出し元が分かるんだーぜーとか。


コードの綺麗さがどうこうって話は無かった事に…orz


いや、Javaクロージャが採用されれば、きっともっと綺麗にかける様になるさ!