当前位置: 首页 > 知识库问答 >
问题:

如何创建编译时常量在静态编程语言从枚举?

哈雅珺
2023-03-14

我有一个注释要求defaultValue是编译时常量。我从下面的enum中获取defaultValue

enum class RaceType {
    MARATHON,
    SPRINT;

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

我的dtos如下:

interface RaceDto {
}

data class MarathonDto: RaceDto

data class SprintDto: RaceDto

当我使用注解@QraphQLArgument(defaultValue=RaceType.SPRINT.name)Kotlin需要RaceType。冲刺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;
}

我仔细研究了类似的问题,但没有找到解决方法。我还找到了一篇与这个主题相关的文章,但到目前为止没有任何效果。

附带说明:我不能更改注释,因为它来自库,我也不能更改库。

总而言之,有没有办法从静态编程语言中的枚举编译时常量到注释中使用?

共有1个答案

华煜祺
2023-03-14

有没有办法让Kotlin中的fromenum编译时常量用于注释?

不,因为在Java中,enums不是编译时常量。

但是请考虑<代码>密封< /代码>类:

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)的问题,因为类的名称与value不相同。换句话说,对于密封类,您需要编写代码将输入字符串转换为它们。

 类似资料:
  • 我希望函数位于类中(不污染全局名称空间),但可以静态访问(从不创建它们所在的对象)。提议的解决办法: 这是一个好的解决方案,还是不可避免地会创建一个对象?我应该使用哪种图案?

  • 我使用的是Gradle 5.5,我有一个基于Groovy的构建脚本,我正试图将其迁移到Kotlin DSL。任务包含将所有依赖项复制到jar文件的典型行: 我找不到一种方法来把这一行翻译成Kotlin DSL。 让我给你一些背景知识。这是我最初基于Groovy的构建脚本: 这是我基于静态编程语言的构建脚本。它运行良好,除了一行:

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 我想知道为什么在下面的代码中没有捕捉到异常: 函数的调用方式如下: 但我还是遇到了一个导致应用程序崩溃的异常: 我想说try/catch块会捕获异常,但唉。。。 什么原因导致异常没有被捕获?我想说线程并不重要,因为我使用try/get块来处理线程中的异常。 在Laalto的回答之后,我更新了代码,如下所示(对于那些感兴趣的人):

  • 我有一个具有多个字段的静态编程语言枚举。其中一个字段()是另一个枚举的值。在运行时,尽管已设置,但此val为空。 我以前从未见过这样的情况,其他字段工作正常,即使是引用当前项目的字段!我已经包含了完整的枚举定义,因为我不确定什么是相关的。 枚举和一个值,其中意外为空,而不是。 电路板枚举和相关值: 这是意外为空的截图: 附加说明: 我尝试更改树9中的其他值,它们都会更新,因此包含的定义肯定就是所使

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。