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
.
显示的内容
如果您的意图是重用调用者记录器,那可能不会那么容易工作...(最简单的方法可能是将它传递给函数,但通常您不希望这样做)...和其他机制可能真的不值得 ;-)
我想要扩展函数并使用 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
.
如果您的意图是重用调用者记录器,那可能不会那么容易工作...(最简单的方法可能是将它传递给函数,但通常您不希望这样做)...和其他机制可能真的不值得 ;-)