Почему интерфейс CloudWatchConfig ожидает строку длительности шага - PullRequest
0 голосов
/ 19 марта 2019

Я использую Micrometer Cloudwatch 1.1.3, поставляемый с Gradle как compile 'io.micrometer:micrometer-registry-cloudwatch:1.1.3'

В Java я могу создать CloudWatchConfig, выполнив следующие действия:

    CloudWatchConfig cloudWatchConfig = new CloudWatchConfig() {
        @Override
        public String get(String s) {
            return "my-service-metrics";
        }

        @Override
        public boolean enabled() {
            return true;
        }

        @Override
        public Duration step() {
            return Duration.ofSeconds(30);
        }

        @Override
        public int batchSize() {
            return CloudWatchConfig.MAX_BATCH_SIZE;
        }
    };

Я думаю, что эквивалентом в Kotlin должно быть:

   val cloudWatchConfig = CloudWatchConfig {
        fun get(s:String) = "my-service-metrics"
        fun enabled() = true
        fun step() = Duration.ofSeconds(30)
        fun batchSize() = CloudWatchConfig.MAX_BATCH_SIZE
   }

Компилятор Koltin завершается ошибкой, указывая на последнюю строку в блоке: fun batchSize() = CloudWatchConfig.MAX_BATCH_SIZE, говоря, что ожидал значение типа String?

После большой отладки я смог это исправить, вернув toString функции step.Вы не можете просто передать любую строку, так как она будет проанализирована, как если бы она была сгенерирована Duration.Мой код Kotlin теперь работает и выглядит следующим образом:

    val cloudWatchConfig = CloudWatchConfig {
        fun get(s:String) = "my-service-metrics"
        fun enabled() = true
        fun step() = Duration.ofSeconds(30)
        fun batchSize() = CloudWatchConfig.MAX_BATCH_SIZE
        step().toString()
    }

После просмотра интерфейсов CloudWatchConfig, StepRegisteryConfig и MeterRegistryConfig я не могу понять, почему это так.Почему Колтин делает это, и почему он ожидает строку продолжительности?

1 Ответ

1 голос
/ 19 марта 2019

Чтобы создать эквивалент анонимного класса в Java, синтаксис немного отличается.Вам необходимо использовать ключевое слово object, а также включить ключевые слова override для методов интерфейса.например,

val cloudWatchConfig = object : CloudWatchConfig {
    override fun get(key: String) = "my-service-metrics"
    override fun enabled() = true
    override fun step() = Duration.ofSeconds(30)
    override fun batchSize() = CloudWatchConfig.MAX_BATCH_SIZE
}
...