【问题标题】:How to combine several annotation into one in Kotlin?如何在 Kotlin 中将多个注释合并为一个?
【发布时间】:2019-04-16 14:54:04
【问题描述】:

我正在尝试使用我的自定义注释来验证 RequestBody。

下面的配置我的验证工作:

data class PlayerRegistration(
    @field: Email
    val email: String,
    @field: Pattern(regexp = NICK_REGEX)
    @field: Size(min = 5, max = 15)
    val nick: String,
    @field: Pattern(regexp = PASSWORD_REGEX)
    @field: Size(min = 8, max = 20)
    val password: String,
    val birthDate: LocalDate
)

但是当我尝试这样总结注释时:

data class PlayerRegistration(
    @field: Email
    val email: String,
    @field: ValidNick
    val nick: String,
    @field: ValidPassword
    val password: String,
    val birthDate: LocalDate
)

@Pattern(regexp = NICK_REGEX)
@Size(min = 5, max = 15)
@Target(AnnotationTarget.FIELD)
private annotation class ValidNick

@Pattern(regexp = EMAIL_REGEX)
@Size(min = 8, max = 20)
@Target(AnnotationTarget.FIELD)
private annotation class ValidPassword

它不起作用。我做错了什么?

【问题讨论】:

标签: kotlin


【解决方案1】:

简而言之:您的方法创建具有注释的注释 - 两级嵌套。这不是对注释进行分组的机制。

试着像注释处理器一样思考。在第一个代码 sn-p 中,处理器看到一个字段 nick 并认为“好的,我知道如何将 PatternSize 应用于字段”。

在第二个代码sn-p中,对于字段nick,它看到ValidNick并认为“我不知道这种类型的注释,我不知道如何将其视为字段约束” .处理器必须知道它必须转到此注解的注解,而且我相信这是不支持开箱即用的。

如果我是你,我不会推动这种代码结构。 IMO 它降低了可读性,因为为了了解 nick 的约束,您必须转到代码的其他部分。理论上它可以重复使用,但问题是:你会有多少次重复使用?

如果你真的想实现类似的东西,而不是注释,我会试试delegated properties。他们让你拦截setter,并将这样的拦截逻辑保留为可重用的类

【讨论】:

    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多