我开发android应用程序,经常使用注释作为编译时参数检查,大多是Android的支持注释。
java代码中的示例:
public class Test
{
@IntDef({Speed.SLOW,Speed.NORMAL,Speed.FAST})
public @interface Speed
{
public static final int SLOW = 0;
public static final int NORMAL = 1;
public static final int FAST = 2;
}
@Speed
private int speed;
public void setSpeed(@Speed int speed)
{
this.speed = speed;
}
}
我不想使用枚举,因为它们在Android中存在性能问题。自动转换器到 kotlin 只会生成无效代码。如何在 kotlin 中使用@IntDef
注释?
更新:
忘了@IntDef和@StringDef吧,现在有了ART,可以用enums代替。
来自官方GoogleIO:
另外,如果您仍然不确定是否应该使用枚举,您可以在这里的第一个答案的评论中听到一群人互相大喊大叫:https://stackoverflow.com/a/37839539/4036390
老答案:
只需将@IntDef类创建为java类,并通过kotlin代码访问它。
示例:
>
创建您的类型类:
公共类mType{@IntDef({typeImpl.type1,typeimp1.type2,typeImpl.type3})@Retention(RetentionPolicy.SOURCE)公共@interface typempl{int type1=0;int type2=1;int type3=2;}
将此函数放在任何Kotlin对象中:
object MyObject{ fun accessType(@mType.typeImpl mType: Int) { ... } }
然后访问它:
fun somOtherFunc(){ MyObject.accessType(type1) }
**注意:您不必将访问方法放入对象中。
目前在Kotlin中没有办法实现这一点,因为注释类不能有主体,因此不能在其中声明由< code>IntDef处理的常量。我在《追踪者:https://youtrack.jetbrains.com/issue/KT-11392》中创造了一期
对于您的问题,我建议您使用简单的枚举。
编辑:如果您错过了问题或答案的注释,值得注意的是,以下技术可以编译,但不会创建在Java中获得的编译时验证(这部分违背了这样做的目的)。请考虑改用enum类。
通过将注释类之外的值定义为const val
s,实际上可以使用@IntDef
支持注释。
使用您的示例:
import android.support.annotation.IntDef
public class Test {
companion object {
@IntDef(SLOW, NORMAL, FAST)
@Retention(AnnotationRetention.SOURCE)
annotation class Speed
const val SLOW = 0L
const val NORMAL = 1L
const val FAST = 2L
}
@Speed
private lateinit var speed: Long
public fun setSpeed(@Speed speed: Long) {
this.speed = speed
}
}
请注意,此时编译器似乎需要@IntDef
注释的Long
,而不是实际的Int
s。
我希望将内置的JUnit5与Gradle Kotlin DSL一起使用,因为在构建过程中,我会收到以下警告: 另外,这个问题是相关的,但要求创建新的任务,而不是定制现有的任务:我如何在gradle kotlin-dsl中覆盖一个任务 这里有一个正常分级的解决方案。
我看到一个例子解释了Kotlin JVM的KATP,它正在工作。 我想知道它是否支持Kotlin JS?有什么例子吗?
静态编程语言是否支持像这样的java注释,因为我无法让它工作。我可以用注释颜色,但实际上没有得到该注释的lint检查。 例子 传递,不显示线头。应使用R颜色显示皮棉。colorPrimary,不与
在Android M上,谷歌已经完全去掉了Apache HTTP客户端的支持。 这也可能是Android M上这么多应用崩溃的原因。 我真的需要更新一个应用程序非常快,但我现在不能将它移植到
Kotlin是一种针对JVM(和其他平台)的静态类型语言,它允许编写简洁而优雅的代码,同时提供与Java编写的现有库的互操作性。 Spring Boot通过利用其他Spring项目(如Spring Framework,Spring Data和Reactor)的支持来提供Kotlin支持。 有关更多信息,请参阅Spring Framework Kotlin支持文档。 从Spring Boot和Kot
我怎么才能让它起作用呢?类似的攻略我看了很多,唉。使用高于23.1.1的支持库多次失败。 第三步:当然,我试了第一个gradlew:App:Dependenics等,但那个一直崩溃。是的,我使用JDK1.8。它是一个注册的bug,从夏天开始一直没有解决。 对了...Android、支持包、浓缩咖啡都是谷歌的?