Метод конструктора Java для Kotlin

#java #kotlin #caching #coding-style #caffeine

#java #kotlin #кэширование #стиль кодирования #кофеин

Вопрос:

Когда я переношу метод конструктора моего сервиса в код Kotlin, я получаю сообщение «Метод никогда не используется». Каким был бы правильный способ перенести приведенный ниже метод в службу Kotlin? Я думаю, что вместо этого можно было бы использовать блок инициализации, но я не уверен.

 public CurrencyServiceImpl() {
    currenciesCache = Caffeine.newBuilder().maximumSize(100).expireAfterWrite(1, TimeUnit.DAYS).build();
}
  

Теперь для Kotlin приведенная ниже функция «CurrencyServiceImpl» никогда не используется»

 fun CurrencyServiceImpl() {
    currenciesCache = Caffeine.newBuilder().maximumSize(100).expireAfterWrite(1, TimeUnit.DAYS)
            .build<String, String>()
}
  

Поэтому я изменил его на приведенный ниже код:

 init {
    currenciesCache = Caffeine.newBuilder().maximumSize(100).expireAfterWrite(1, TimeUnit.DAYS)
            .build<String, String>()
}
  

Но я не уверен, считается ли это «подходящим».

Комментарии:

1. Да, это правильно. init блоки вызываются во время создания экземпляра. Функция, подобная приведенному в вашем верхнем примере, не имеет ничего общего с конструкторами. Я рекомендую ознакомиться с синтаксисом Kotlin для конструкторов.

2. Вы даже можете переместить его из блока инициализации. Вы можете объявить его и определить в той же строке.

Ответ №1:

Ваш init идеально подходит.

Обратите внимание, что fun CurrencyServiceImpl() вы определили ранее, это не конструктор, а функция-член, следовательно, почему он не использовался. Конструкторы в Kotlin должны быть объявлены с использованием cosntructor ключевого слова.

Комментарии:

1. constructor Ключевое слово необходимо только для вторичных конструкторов. Первичные конструкторы могут быть определены перед начальными фигурными скобками определения класса без ключевого слова (если вы не хотите использовать аннотации к нему).

2. Действительно. Спасибо за разъяснение этого!