자바에서 lombok을 쓰면서 고민도 하지 않았던 부분인데… 여기서는 왠지 신경쓰이는 부분.
class SimpleClass {
private val log = LoggerFactory.getLogger(SimpleClass::class.java)
}
이렇게 해야되는데.. 이렇게 매번쓰기 귀찮으니
CoreUtil.kotlin
inline fun
return LoggerFactory.getLogger(T::class.java)
}
inline fun logger2(): Logger {
return LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())
}
이걸 선언 해 두고 가져다 쓴다.
오브젝트에 선언하면 스태틱처럼 선언도 가능하지만 클래스 밖에 선언해두면 전역전역펑션으로 선언된다
인라인이 아니었다면… 클래스를 파라미터로 전달했겠지만 이렇게 해서 좀 더 간단해진다.
refied는 여기 참고.
https://medium.com/@joongwon/kotlin-kotlin-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%B0%8F-%EC%97%B0%EC%82%B0%EC%9E%90-%ED%95%B4%EB%B6%80-part-3-59ff3ed736be
logger2는 댓글에 써 있는 방법.. 좀 더 간단해 보이는데 검증은 필요.
h2. 처리방법 1
companion object 길어서 좀 꼴뵈기 싫다
class MemberService {
companion object {
private val log = logger
}
}
h2. 처리방법 2
위에다 선언… intellij에서 클래스 표시가 꺼진다. 왠지 기분나쁨
private val log = logger
class MemberService {
}
h3. 처리방법 3
인터페이스, 앱스트랙트 사용
선언이 좀 성가셔 보이는데 코드가 제일 깔끔해보인다.
매번 호출하는건 아니겠지?
interface Logger {
fun logger() = LoggerFactory.getLogger(this.javaClass)
}
class SimpleClass {
companion object : Logger
fun testfun(){
logger().info("aaa")
}
}
abstract class Logger {
val logger: Logger = LoggerFactory.getLogger(this.javaClass)
}
class SimpleClass {
companion object : Logger()
fun testfun(){
logger.info("aaa")
}
}