kotlin中具有扩展函数的伴生对象?

kotlin中具有扩展函数的伴生对象?,kotlin,companion-object,extension-function,kotlin-companion,Kotlin,Companion Object,Extension Function,Kotlin Companion,我想有扩展功能,并使用记录器从和有常数内的同伴对象 我的职能: fun String.toFoo(): Foo { logger.debug { "Mapping [$this] to Foo" } if(MY_CONST.equals(this) { ... } 问题是我应该把val logger=KotlinLogging.logger{}和MY_CONST放在哪里,因为我不能将companion对象与扩展函数一起使用?如果你只想让你的logger成为

我想有扩展功能,并使用记录器从和有常数内的同伴对象

我的职能:

fun String.toFoo(): Foo {

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

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

问题是我应该把
val logger=KotlinLogging.logger{}
MY_CONST
放在哪里,因为我不能将companion对象与扩展函数一起使用?

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

Object LoggerSingleton( val logger = KotlinLogging.logger{})
然后在扩展函数中

fun String.toFoo(): Foo {

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

if(MY_CONST.equals(this) { 
 }
由于Kotlin中的一个对象保证只有一个实例,所以每次使用toFoo都不会有不同的记录器

编辑 保留所需的类名 像这样:


我不知道您想用记录器完成什么,但我向您展示了我已经完成的;-)

通常,我将扩展函数放在其自己的文件中,文件名与函数实际扩展的内容类似(例如
StringExtensionFunction
,或者如果扩展函数与其用途更相关,并且可能仅在某些依赖项可用时才可用,我还做了类似的操作,例如
jsouppextensionfunctions
(其中有一个
字符串.toJsoupHtml()
文件.toJsoupXml()
,等等)

如果我需要常数,我只需将它们放在该文件中,例如,只需编写如下内容:

private const val MY_CONST = "my_const_value"
无周围
,无周围
对象

关于
记录器
…由于记录器通常绑定到某个名称/类,我通常在每个(重要)类中放置一个记录器,或者将某些记录器与特定名称关联…因此我不完全确定您的意图是什么…如果记录器返回扩展函数的容器对您来说没有问题的话(可能是
StringExtensionFunction.kt
),然后您还可以在该文件中放置一个记录器val,类似于我用
MY_CONST
显示的内容


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

在哪里存储扩展函数中使用的常量?如果它们确实是常量,那么将它们存储在函数中,如果它们来自配置,只需将它们从配置文件加载到一个单例中,并使用与logger相同的模式引用该单例。Argh,我刚刚发现“kotlin logging”需要nam因此,创建一个单例将隐藏真正的类名:(只需给它一个类名,而不是使用lambda签名
private const val MY_CONST = "my_const_value"