kotlin中具有扩展功能的伴随对象?

Companion object with extension function in kotlin?

我想要扩展函数并使用 kotlin-logging 中的记录器,并在伴随对象中包含常量。

我的函数:

fun String.toFoo(): Foo {

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

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

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

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

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

然后在你的扩展函数中

fun String.toFoo(): Foo {

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

if(MY_CONST.equals(this) { 
 }

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

编辑 保留所需的 class 名称 Use this signature 像这样:

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

我不知道你想用你的记录器完成什么,但我告诉你我已经做了什么;-)

通常我将扩展函数放在它自己的文件中,名称与函数实际扩展的名称相似(例如 StringExtensionFunction 或 if 与其目的更相关,并且可能仅在某些依赖项可用时才可用,我还做了类似的事情,例如 JsoupExtensionFunctions(其中有 String.toJsoupHtml()File.toJsoupXml() 等))。

如果我需要常量,我只需将它们放在那个文件中,例如通过写类似的东西:

private const val MY_CONST = "my_const_value"

无周边class,无周边object.

关于 logger... 因为记录器通常绑定到某个 name/class,我通常在每个(重要的)class 中放置一个记录器或将一些记录器关联到特定的名称......所以我不完全确定你的意图是什么......如果记录器返回你的扩展函数的容器(可能是StringExtensionFunction.kt)对你来说没问题,那么你也可以放一个记录器-val 在该文件中类似于我用 MY_CONST.

显示的内容

如果您的意图是重用调用者记录器,那可能不会那么容易工作...(最简单的方法可能是将它传递给函数,但通常您不希望这样做)...和其他机制可能真的不值得 ;-)