如何在Kotlin中将多个注释合并为一个?

时间:2019-04-16 14:54:04

标签: kotlin

我正在尝试使用自定义注释来验证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

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

1 个答案:

答案 0 :(得分:0)

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

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

在第二个代码段中,对于字段nick,它看到ValidNick并认为:“我不知道这种类型的注释,也不知道如何将其视为字段约束”。处理器将必须知道必须转到该批注的批注,而且-我认为-尚不支持即开即用。

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

如果您真的想实现类似的目的,而不是使用注释,请尝试delegated properties。他们让您拦截设置器,并将拦截逻辑保留为可重用的类