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

如何在Kotlin中实现Java的@StringDef

赵晟睿
2023-03-14

我的Kotlin项目需要一个Java@StringDef注释。

不幸的是,这似乎很困难。我在这里找到了这种讨论:

https://discuss.kotlinlang.org/t/intdef-and-stringdef-not-being-checked-at-compile-time/7029/3

我明白这可能是一个Lint问题。不执行编译时检查。两人都没有提出任何建议。我可以添加任何字符串作为参数。

我最终用我的常量创建了一个Java类。

public class AppFeatures {

    /** @hide */
    @StringDef({USER, USER_ACCOUNT})
    @Retention(RetentionPolicy.SOURCE)
    public @interface AppFeature {}

    /** Constants for certain features */
    public static final String USER = "user";
    public static final String USER_ACCOUNT = "user.account";
}

使用 Kotlin 等效项时,没有编译时检查也没有建议。

我尝试了类似的方法,但没有成功:

@StringDef(USER, USER_ACCOUNT)
@Retention(AnnotationRetention.SOURCE)
annotation class AppFeature

const val USER = "user"
const val USER_ACCOUNT = "user.account"

那么我如何在Kotlin中实现这一点呢?

共有1个答案

高恺
2023-03-14

@StringDef现在可以工作,如果您在配套对象中定义它。例如:

public class Test {

    companion object {

         @StringDef(SLOW, NORMAL, FAST)
         @Retention(AnnotationRetention.SOURCE)
         annotation class Speed

         const val SLOW = "slow"
         const val NORMAL = "normal"
         const val FAST = "fast"
    }

    @Speed
    private lateinit var speed: String

    public fun setSpeed(@Speed speed: String) {
        this.speed = speed
    }
}

此代码示例主要抄袭自:
https://newbedev.com/how-to-use-android-support-typedef-annotations-in-kotlin

也请考虑使用Kotlin枚举类,这将允许您为每个枚举指定字符串值:< br > https://kotlinlang.org/docs/enum-classes.html

枚举对于使用Dalvik运行的手机来说是一个内存问题,但它基本上已经停止使用ART(Android运行时机器)。再加上即使是较贫穷国家的人也拥有相当强大的手机,并且Proguard现在可以比以往任何时候都更好地优化代码,可以肯定地说,枚举不再造成性能问题。更多关于这里的信息:
https://www.ericthecoder.com/2019/10/07/kotlin-or-java-enum-classes-the-good-the-bad-and-the-ugly/

 类似资料:
  • 今天,我在kotlin中实现了一个,正如我过去在java中所做的那样,我希望实现一个,作为最后的后退,以防客户机代码忘记关闭它,从而使关键资源无法回收。我认为此资源足够重要,可以添加此回退,尽管此回退不可靠。但是,没有声明方法,这意味着我不能简单地做到这一点: 但是这种变通方法需要一个超类。如果下次我的其他已经获得了一个超类,那么如果没有大量的样板文件,这个变通方法将无法工作。

  • 我有接口 然后创建了一个类,并实现了 IDE没有显示任何错误,但当我编译时,会出现以下错误 null 并且编译时错误已经消失。

  • 嗨,我是Kotlin世界的新手。我喜欢到目前为止所看到的,并开始考虑将我们在应用程序中使用的一些库从Java转换为Kotlin。 第二次更新:问题是如何用Kotlin中的一些参数为一个简单的pojo编写一个构建器设计模式?下面的代码是我的尝试,方法是编写java代码,然后使用eclipse-kotlin-plugin转换为Kotlin。

  • 我一直在努力尝试让Bouncy Castle Scrypt进入我的web应用程序进行密码加密。我对Java编程和安全性相当陌生。 我试着查看了Bouncy Castle的Scrypt类文档。然而,我真的很难弄清楚它是如何工作的。它似乎并没有真正给出如何创建类或诸如此类的信息。 我在Stack Exchange和Google上搜索了一下,看看是否有什么地方可以给出一个很好的示例,说明我应该做什么来创

  • 问题内容: 数组在Java中被实现为对象,对吗?如果是这样,我可以在哪里查看数组类的源代码。我想知道数组中的length变量是否定义为常量,如果是这样,为什么不是全部使用大写字母LENGTH来使代码更易于理解。 问题答案: 尽管从它们继承java.lang.Object的角度来看,数组是Object,但是这些类是作为语言的特殊功能动态创建的。它们未在源代码中定义。 考虑以下数组: 没有这样的源代码

  • 问题内容: 我是jfreechart的新手。我想显示一个基于数据库表中值的图表。表为dns_time,文件名为dns_lookup_time,update_time。我想在x轴上使用update_time,在y轴上使用dns_lookup_time,并且应该根据数据库中的值显示曲线。我使用的是hibernate和postgresql,谁能帮助我实现这一目标,谢谢。 问题答案: 您可能会看一下,它可