Класс текущей статической области видимости в Scala - PullRequest
1 голос
/ 24 февраля 2011

Я сейчас создаю логгеры (с конфигурацией) так:

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

Я бы хотел избежать повторения «MyClass», как в classOf[MyClass] (например, я хочу быстро скопировать и вставить строку определения журнала, без интеллектуальной IDE, расширяющей шаблон именем класса), но я не хочу использовать динамический класс текущего объекта, например:

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

РЕДАКТИРОВАТЬ: потому что таким образом экземпляры подклассов будут иметь объект класса подкласса, передаваемый родительскому логгеру:

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

new SubClass().doit

будет использовать регистратор, настроенный для подкласса, а не MyClass, как я хочу.

Есть ли способ иметь какое-то фиксированное выражение, которое каким-то образом дает класс, который определяется в этой точке?

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Короткий ответ: у Scala нет способа сделать это. Длинный ответ заключается в том, что вы можете сделать это, но это уродливый взломать. Хаком является использование того факта, что трассировки стека исключений включают в себя имя статического определения класса, в котором была создана трассировка стека. Парс и тада. Но, серьезно, не делай этого. Или, если вы это сделаете, переместите его в черту 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")
}
1 голос
/ 24 февраля 2011

Конечно, вы можете просто использовать модификатор защищенного доступа и получить к нему доступ напрямую?

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

class SubClass extends MyClass {
}

new SubClass().doit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...