什么是一种习惯性的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. }
- Docs for Spring告诉我,myRepository.findOne(Id id)返回实体,如果没有find,则返回null,但IntelliJ说不同
- Android Anko警报与自定义视图错误(Kotlin)
- Retrofit 2.0如何获得反序列化的错误response.body
- 如何实现一个延迟加载recyclerView适配器,像使用kotlin的realm recyclerView适配器
- android -kotlin -java.lang.ClassCastException
- 尝试在Android Studio 2.2.1中运行新项目时出错
- 简单的方法来找出一个类是匿名/对象,并从Kotlin实例中获取具体的类名
- 我的计算器android应用程序有什么问题?
- 为什么Kotlin不能推断下面的lambda参数(在Java – > Kotlin转换之后)?
- 如何更有效地使用@Nullable和@Nonnull注释
- Kotlin Fuel REST客户端代理错误