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"