1

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

我的功能:

fun String.toFoo(): Foo {

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

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

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

4

2 回答 2

1

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

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"))
于 2019-01-29T14:29:55.940 回答
0

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

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

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

private const val MY_CONST = "my_const_value"

没有环绕class,没有环绕object

关于logger......因为记录器通常与某个名称/类相关联,我通常在每个(重要)类中放置一个记录器或将一些记录器与特定名称相关联......所以我不完全确定你的意图是什么。 .. 如果记录器返回您的扩展函数的容器(也许StringExtensionFunction.ktMY_CONST..

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

于 2019-01-30T10:26:20.380 回答