【问题标题】:Kotlin mandatory explicit annotation parameter names? @Foo(>>bar<< = 42)Kotlin 强制显式注释参数名称? @Foo(>>栏<< = 42)
【发布时间】:2021-12-18 16:59:21
【问题描述】:

如何强制 Kotlin Annotation 参数的名称显式声明?

// Having an annotation class Foo
annotation class Foo(val bar: String)


// This declaration should work
// we explicitly provided parameter name
@Foo(bar = "42")
class X

// This should fail
// we didn't explicitly provide a name
@Foo("42")
class Y 

据我了解,不可能使用现有的 Kotlin 编译器和/或 IDE?我说的对吗?

如果我们正在考虑自定义实现:

  • Kotlin 生态系统中有现成的解决方案吗?
  • 是否可以使用 Kotlin 编译器插件/KSP 实现防护?

【问题讨论】:

    标签: kotlin annotations kotlinc


    【解决方案1】:

    这种 hack 是我能想到的唯一方法,而无需在编译器端或 lint 上做任何事情。创建一个具有默认值且位于您关心的参数之前的相同类型的额外参数。那么如果没有指定bar = ,那么只传递一个未命名的参数就会产生歧义,所以你不得不通过名字来指定它。

    annotation class Foo(val unused: String = "", val bar: String)
    

    这不是万无一失的,因为有人可以在不命名的情况下指定两者。

    @Foo("", "x")
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多