我有一个批注,要求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中的
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 bug或follow this thread进行投票。
但是,据我所知,不幸的是,这不能解决您的@QraphQLArgument(defaultValue = RaceType.SPRINT.name)
问题,因为类名与值不相同。换句话说,对于密封类,您需要编写代码以将输入字符串转换为它们。