Как создать постоянную времени компиляции в Kotlin из enum? - PullRequest
0 голосов
/ 20 января 2020

У меня есть аннотация, которая требует, чтобы defaultValue была постоянной времени компиляции. Я беру defaultValue из enum ниже:

enum class RaceType {
    MARATHON,
    SPRINT;

    companion object {
        fun apply(type: RaceType): RaceDto {
            return when (type) {
                MARATHON -> MarathonDto()
                SPRINT -> SprintDto()
            }
        }
    }
}

Мои dto следующие:

interface RaceDto {
}

data class MarathonDto: RaceDto

data class SprintDto: RaceDto

при использовании аннотации @QraphQLArgument(defaultValue = RaceType.SPRINT.name) Kotlin требуется RaceType.SPRINT.name быть постоянной времени компиляции.

Сама реализация аннотации:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface GraphQLArgument {
    String NONE = "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
    String NULL = "\n\t\t\n\t\t\n\ue000\ue001\ue002\ue003\n\t\t\t\t\n";

    String name();

    String description() default "";

    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";

    Class<? extends DefaultValueProvider> defaultValueProvider() default JsonDefaultValueProvider.class;
}

Я просмотрел похожих вопросов , но не понимаю, как это может быть решена. Я также нашел статью , относящуюся к topi c, но пока ничего не получалось.

Примечание: я не могу изменить аннотацию, так как она из библиотеки, и я также не могу изменить библиотеку .

Подводя итог, есть ли способ сделать из enum константы времени компиляции в Kotlin использование в аннотации?

1 Ответ

3 голосов
/ 20 января 2020

есть ли способ сделать из enum константы времени компиляции в Kotlin использование в аннотации?

Нет, потому что формально enum s не являются константами времени компиляции в Java.

Однако, пожалуйста, обратите внимание на sealed классы:

sealed class RaceType {
    object MARATHON: RaceType() {
        const val name = "MARATHON" // copy-paste is required here until https://youtrack.jetbrains.com/issue/KT-16304
    }
    object SPRINT: RaceType()

    companion object {
        fun apply(type: RaceType): RaceDto {
            return when (type) { // the check is in compile time, because of sealed class
                MARATHON -> MarathonDto()
                SPRINT -> SprintDto()
            }
        }
    }
}

Небольшая часть копирования-вставки все еще требуется. Пожалуйста, проголосуйте за kotlin ошибку компилятора или следуйте этой теме .

Однако, насколько я понимаю, это не решит вашу проблему с @QraphQLArgument(defaultValue = RaceType.SPRINT.name), к сожалению, потому что имя класса не совпадает со значением. Другими словами, для закрытых классов вам нужно написать код для преобразования в них входных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...