#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. Действительно. Спасибо за разъяснение этого!