首页 > 解决方案 > kotlin中具有扩展功能的伴侣对象?

问题描述

我想拥有扩展功能并使用来自kotlin-logging 的记录器,并在伴随对象中拥有常量。

我的功能:

fun String.toFoo(): Foo {

    logger.debug { "Mapping [$this] to Foo" }

    if(MY_CONST.equals(this) { 
        ...
}

问题是我应该放在哪里val logger = KotlinLogging.logger {}MY_CONST因为我不能使用带有扩展功能的伴生对象?

标签: kotlincompanion-objectextension-functionkotlin-companion

解决方案


如果您只想让记录器成为单例,则可以创建一个包含记录器实例的对象并从那里访问它。

Object LoggerSingleton( val logger = KotlinLogging.logger{})

然后在您的扩展功能中

fun String.toFoo(): Foo {

LoggerSingleton.logger.debug { "Mapping [$this] to Foo" }

if(MY_CONST.equals(this) { 
 }

由于 Kotlin 中的 Object 保证只有一个实例,因此每次使用 toFoo 时不会有不同的记录器。

编辑 保留所需的类名 使用此签名 像这样:

Object StringLoggerSingleton( val logger = KotlinLogging.logger("String"))

推荐阅读