什么是一种习惯性的Kotlin方式来获得记录器?
我期待取代
private static final Logger log = Logger.getLogger(MyClass.class);
有些东西是不那么冗长和更习惯的
class MyClass { companion object { val log = LoggerFactory.getLogger(MyClass::class.java) } fun usage() { log.debug("Success") } }
奖励积分不必在每个class级去除它。
我试过了:
interface HasLogger { val log: Logger get() = LoggerFactory.getLogger(this.javaClass) }
但是这导致getLogger()调用每个用法(不可接受)也返回一个记录器的子types(而不是它声明的)。
您可以创建一个实用程序方法
inline fun loggerFor() = LoggerFactory.getLogger(T::class.java)
并简单地使用它
class MyClass { companion object { val log = loggerFor() } fun usage() { log.debug("Success") } }
或者,你可以使用一个文件级别的私人记录器,这样可以节省一些输入,当你没有多个类,每个文件定义了自己的记录器时,这似乎只是一个很好的解决方案:
private val log = loggerFor() class MyClass { fun usage() { log.debug("Success") } }
首先,您可以为记录器创建添加扩展function。
inline fun getLogger() = LoggerFactory.getLogger(T::class.java) fun T.getLogger() = LoggerFactory.getLogger(javaClass)
然后你将能够使用下面的代码创建一个记录器。
private val logger1 = getLogger() private val logger2 = getLogger()
其次,你可以定义一个接口来提供一个记录器及其混合实现。
interface LoggerAware { val logger: Logger } class LoggerAwareMixin(containerClass: Class<*>) : LoggerAware { override val logger: Logger = LoggerFactory.getLogger(containerClass) } inline fun loggerAware() = LoggerAwareMixin(T::class.java)
这个接口可以用下面的方式。
class SomeClass : LoggerAware by loggerAware() { // Now you can use a logger here. }