Сопутствующий объект с функцией расширения в 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
,
Если вы намеревались скорее использовать регистратор вызывающих абонентов, это может не сработать так легко... (тогда, вероятно, проще всего было бы передать его функции, но обычно вы этого не хотите)... и другие механизмы могут этого не делать действительно стоит того;-)