2012-03-31 17 views
1

をログには、次のクラス定義を考えてみましょう。クラスCのオブジェクトを作成する素晴らしい作品Logulaは匿名クラスのインスタンス上で

new C() 

と予想される出力生成:

INFO [2012-03-31 19:16:14,261] C: from A 
INFO [2012-03-31 19:16:14,263] C: from C 

しかし

new A() {} 
の匿名のサブクラスのインスタンスを作成します

NullPointerExceptionを返します。

Exception in thread "main" java.lang.NullPointerException 
    at com.codahale.logula.Log$.clean(Log.scala:25) 
    at com.codahale.logula.Log$.forName(Log.scala:23) 
    at com.codahale.logula.Log$.forClass(Log.scala:18) 
    at com.codahale.logula.Logging$class.log(Logging.scala:172) 
    at A.log(LoggingTraitTest.scala:3) 
    at A.<init>(LoggingTraitTest.scala:3) 
    at LoggingTraitTest$$anon$1.<init>(LoggingTraitTest.scala:8) 
    at LoggingTraitTest$delayedInit$body.apply(LoggingTraitTest.scala:8) 
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34) 
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) 
    at scala.App$$anonfun$main$1.apply(App.scala:60) 
    at scala.App$$anonfun$main$1.apply(App.scala:60) 
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59) 
    at scala.collection.immutable.List.foreach(List.scala:45) 
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:30) 
    at scala.App$class.main(App.scala:60) 
    at LoggingTraitTest$.main(LoggingTraitTest.scala:6) 
    at LoggingTraitTest.main(LoggingTraitTest.scala) 

Cの匿名サブクラスがインスタンス化されている場合と同様の例外がスローされます。new C() {}

なぜここに明示し、匿名クラスのインスタンス化の間に違いがありますか?

私は何が起こっているのかを知るためのヒントは歓迎されるでしょう。前もって感謝します!

答えて

2

問題は、Logulaはクラスの正規名が欲しいということです。これは匿名クラスには存在しません。 Class.getCanonicalNameのために例えばドキュメントを参照してください: Java言語仕様で定義されているよう

は、基本となるクラスの正規名を返します。基底クラス が正規名を持たない場合(つまり、ローカルまたは匿名の クラスまたはコンポーネントタイプが標準 という名前の配列でない場合)、nullを返します。

ですから、この1に運の出ているように見えますが、あなたは本当に、本当に匿名クラスでログを使用できるようにするために必要な場合は、次の行(18)にgetSimpleNamegetCanonicalNameを置き換えることができますLogulaソースでLog.scalaの:

0 [main] INFO C - from A 
1 [main] INFO C - from C 
1 [main] INFO anon.2 - from A 
2 [main] INFO anon.1 - from A 
2 [main] INFO anon.1 - from C 

おそらく、多かれ少なかれ、あなたが望むものである:

def forClass(klass: Class[_]) = forName(klass.getCanonicalName) 

これは私に次のような出力を提供します。私はこの変更が頭痛をラインの下に導入するかどうかを知るためにLogulaに十分に精通していません。

+3

私はあなた自身のlogula loggerであることも簡単に分かりました。 'A'クラスの' lazy override val log = Log.forClass(classOf [A]) 'は' A'のすべての匿名インスタンスを使用しますロガー解決名としての 'A'クラス。 –

関連する問題