斯卡拉自我意识的特质

Bry*_*unt 2 types scala traits

我已经制作了一个Logging特性,它封装了日志记录实现的细节,它既漂亮又懒惰,所以特别是当特定日志级别不活动时也是如此.

/**
* A SLF4J based logging trait 
*/
trait Log {
import org.slf4j.Logger
import org.slf4j.LoggerFactory

val loggedClazz: Class[_]

lazy val logger: Logger = LoggerFactory.getLogger(loggedClazz.getClass)

def logDebug(codeblock: => String) = {
  if (logger.isDebugEnabled) {
    logger.debug(codeblock)
  }
}

def logError(codeblock: => String) = {
  if (logger.isErrorEnabled) {
    logger.error(codeblock)
  }
}

def logInfo(codeblock: => String) = {
  if (logger.isInfoEnabled) {
    logger.info(codeblock)
  }
}

def logWarn(codeblock: => String) = {
  if (logger.isWarnEnabled) {
    logger.warn(codeblock)
  }
}
}
Run Code Online (Sandbox Code Playgroud)

但是,它需要将这个特性混入的类来实现以下内容.

object MyServer extends Log {
   val loggedClazz = MyServer.getClass
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有可能以某种方式使Trait知道它被混入哪个类?删除需要做:

   val loggedClazz = MyServer.getClass
Run Code Online (Sandbox Code Playgroud)

解决方案:根据提供的反馈,我按以下方式重写了课程.

/**
 * A SLF4J based logging trait 
 */
trait Log {
  import org.slf4j.Logger
  import org.slf4j.LoggerFactory

  lazy val logger: Logger = LoggerFactory.getLogger(getClass)

  def logDebug(codeblock: => String) = {
    if (logger.isDebugEnabled) {
      logger.debug(codeblock)
    }
  }

  def logError(codeblock: => String) = {
    if (logger.isErrorEnabled) {
      logger.error(codeblock)
    }
  }

  def logInfo(codeblock: => String) = {
    if (logger.isInfoEnabled) {
      logger.info(codeblock)
    }
  }

  def logWarn(codeblock: => String) = {
    if (logger.isWarnEnabled) {
      logger.warn(codeblock)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

完全简单.当你做对了,第一次;)

pon*_*zao 5

你可以替换val loggedClazz: Class[_]使用val loggedClazz = getClass.