Сопутствующий объект с функцией расширения в kotlin?

Я хотел бы иметь функцию расширения и использовать logger из kotlin-logging и иметь константы внутри объекта-компаньона.

Моя функция:

fun String.toFoo(): Foo {

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

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

Вопрос, где я должен поставить val logger = KotlinLogging.logger {} а также MY_CONST так как я не могу использовать сопутствующий объект с функцией расширения?

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.

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

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

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

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

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

private const val MY_CONST = "my_const_value"

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

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

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

Другие вопросы по тегам