2011-02-24 41 views
1

我目前正在建設記錄儀(帶configgy)是這樣的:類的靜態電流範圍在斯卡拉

class MyClass { 
    private val log = Logger.get(classOf[MyClass]) 
} 

我想避免重蹈「MyClass的」爲classOf[MyClass](例如我要快速複製粘貼日誌定義行,沒有智能IDE擴大與類名模板),但我不希望使用當前對象的動態類,如:

class MyClass { 
    private val log = Logger.get(this.getClass) 
} 

編輯:因爲這樣的實例子類將把子類類對象傳遞給父類gger:

class MyClass { 
    private val log = Logger.get(this.getClass) 
    def doit = log.info("doing") 
} 
class SubClass extends MyClass { 
} 

new SubClass().doit 

將使用配置爲子類中的記錄,而不是MyClass的,因爲我想要的。

有沒有辦法讓某個固定的表達式產生某種程度的正在被定義的類?

+0

你可以給一個例子顯示一個情況,其中this.getClass不是你想要的嗎?你是在繼承的背景下談論的嗎? – 2011-02-24 13:27:49

回答

1

簡短的回答是,Scala沒有辦法做到這一點。漫長的回答是,你可以做到,但這是一個醜陋的黑客。破解是使用異常堆棧跟蹤包含創建堆棧跟蹤的靜態類定義的名稱的事實。解析和tada。但是,嚴肅地說,不要這樣做。或者,如果你這樣做,將其移動到mixin特徵中,並修改解析位以從跟蹤中的適當位置拉取類名。另外,我只在一些相當有限的條件下測試了這一點:不保證它能在任何地方工作。

class MyClass { 
    private val log = Logger get (Class forName (
    new RuntimeException().getStackTrace.apply(0).toString takeWhile 
     (_ != '(') split "\\." dropRight 1 mkString ".")) 
    def doit = log.info("doing") 
} 
+0

謝謝,這是一個很好的竅門,但我寧願在編譯時做這件事,也許是一個編譯器插件。 – ithkuil 2011-02-26 12:02:10

1

當然,您可以使用受保護的訪問修飾符並直接訪問它?

class MyClass { 
    protected val log = Logger.get(classOf[MyClass]) 
} 

class SubClass extends MyClass { 
} 

new SubClass().doit 
+0

我想避免寫兩次類的名字(「MyClass」)。 – ithkuil 2011-02-24 15:55:40