Kotlin中具有扩展功能的伴侣对象?

时间:2019-01-29 14:23:01

标签: kotlin companion-object extension-function kotlin-companion

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

我的功能:

fun String.toFoo(): Foo {

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

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

问题是我应该放在val logger = KotlinLogging.logger {}MY_CONST的地方,因为我不能将伴随对象与扩展功能一起使用?

2 个答案:

答案 0 :(得分:2)

如果只希望记录器为单例,则可以创建一个包含记录器及其实例的对象,然后从那里访问它。

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

然后在您的扩展功能中

fun String.toFoo(): Foo {

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

if(MY_CONST.equals(this) { 
 }

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

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

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

答案 1 :(得分:0)

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

通常,我将扩展函数放在其自己的文件中,该文件的名称类似于该函数实际扩展的文件(例如,var input1 = $(".input1").val(); var input2 = $(".input2").val(); var score1 = $("#score1").val(); var score2 = $("#score2").val(); var sumproduct = (parseFloat(input1) * parseFloat(score1)) + (parseFloat(input2) * parseFloat(score2)); var unit = 0.50; var sumproduct = sumproduct.toFixed(2); var remainder = parseFloat(sumproduct) % parseFloat(unit); var mround = (parseFloat(remainder) < parseFloat(unit)/2) ? parseFloat(sumproduct) - parseFloat(remainder) : parseFloat(sumproduct) + (parseFloat(unit) - parseFloat(remainder)); var mround = String(mround.toFixed(2)); $('#total_score').val(mround); // console.log(input1); // console.log(input2); // console.log(score1); // console.log(score2); // console.log(sumproduct); // console.log(mround); ,或者与其用途更相关,并且可能仅在某些依赖项可用时才可用,我也做了之类的东西,例如StringExtensionFunction(其中有JsoupExtensionFunctionsString.toJsoupHtml()等)。

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

File.toJsoupXml()

没有private const val MY_CONST = "my_const_value" ,没有class

关于object ...,因为记录器通常与某个名称/类相关联,所以我通常在每个(重要)类中都放置一个记录器,或者将某些记录器与特定名称相关联...所以我不是完全确定您的意图是...如果记录程序可以返回扩展函数的容器(也许是logger),那么您还可以将logger-val放在该文件中,类似于我和StringExtensionFunction.kt一起出现。

如果您打算重用调用方记录器,则可能不太容易...(然后最简单的方法是将其传递给函数,但通常您不希望这样做)...以及其他机制可能并不真正值得;-)