Сопутствующий объект с функцией расширения в kotlin? - PullRequest
0 голосов
/ 29 января 2019

Я хотел бы иметь функцию расширения и использовать регистратор из 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 голосов
/ 30 января 2019

Я не знаю, что вы хотите сделать с помощью своего логгера, но я покажу вам, что я уже сделал; -)

Обычно я помещаю функции расширения в свой собственный файл, который называется так же, как на самом деле эта функциярасширение (например, либо StringExtensionFunction, либо, если оно больше связано с его назначением и, возможно, доступно только при наличии определенных зависимостей, я также сделал что-то вроде, например, JsoupExtensionFunctions (где было String.toJsoupHtml(), File.toJsoupXml() и т. д.).)).

Если мне тогда нужны константы, я просто помещаю их в этот файл, например, просто записывая что-то вроде:

private const val MY_CONST = "my_const_value"

Нет окружающих class, никаких окружающих object.

Относительно logger ... поскольку регистраторы обычно связаны с определенным именем / классом, я обычно помещаю регистратор в каждый (важный) класс или связываю некоторый регистратор с конкретными именами ... Так что яЯ не совсем уверен, что вы намерены здесь сделать ... Если для вас нормально, что регистратор возвращает контейнер вашей функции расширения (возможно, StringExtensionFunction.kt), то вы также можете поместить logger-val в этот файл simЭто похоже на то, что я показал с MY_CONST.

. Если вы намеревались скорее использовать регистратор вызывающих абонентов, это могло бы не сработать так легко ... (тогда проще всего было бы, вероятно, передать его функции,но обычно вы этого не хотите) ... и другие механизмы могут не стоить этого; -)

0 голосов
/ 29 января 2019

Если вы просто хотите, чтобы ваш регистратор был одноэлементным, вы можете создать объект, который содержит экземпляр регистратора и добраться до него оттуда.

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

Затем в вашей функции расширения

fun String.toFoo(): Foo {

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

if(MY_CONST.equals(this) { 
 }

Поскольку у объекта в Kotlin гарантированно будет только один экземпляр, у вас не будет отдельного регистратора для каждого использования toFoo.

РЕДАКТИРОВАТЬ Чтобы сохранить желаемое имя класса Используйте эту подпись Вот так:

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