0

如何强制 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 Compiler Plugin / KSP 实现防护?
4

1 回答 1

1

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

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

这不是万无一失的,因为有人可以指定两者而不命名它们。

@Foo("", "x")
于 2021-11-04T13:16:48.040 回答