如何通过枚举在Kotlin中创建编译时常量?

问题描述 投票:0回答:1

我有一个批注,要求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;
}

我浏览了similar questions,但看不到解决该问题的方法。我还发现article与该主题相关,但到目前为止没有任何效果。

旁注:由于注释来自库,因此我也不能更改库。

总而言之,是否有一种方法可以使Kotlin中的enum编译时常数在注释中使用?

kotlin annotations compile-time-constant graphql-spqr
1个回答
1
投票

有没有一种方法可以使Kotlin中的enum编译时常数在注释中使用?

否,因为正式是enum aren't compile-time constants in Java

但是请考虑“密封”类:

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 compuler bugfollow this thread进行投票。

但是,据我所知,不幸的是,这不能解决您的@QraphQLArgument(defaultValue = RaceType.SPRINT.name)问题,因为类名与值不相同。换句话说,对于密封类,您需要编写代码以将输入字符串转换为它们。

© www.soinside.com 2019 - 2024. All rights reserved.