Kotlin 注解关键字
最后修改于 2025 年 4 月 19 日
Kotlin 中的注解提供了一种将元数据附加到代码元素的方式。annotation
关键字用于声明自定义注解。本教程通过实际例子深入探讨了注解。
基本定义
注解是提供关于代码元素元数据的特殊属性。它们不直接影响程序执行,但可以被工具或框架处理。Kotlin 支持内置和自定义注解。
内置 @Deprecated 注解
Kotlin 提供了几个内置注解。@Deprecated
注解标记不再使用的元素。它通过警告用户过时代码来帮助 API 演进。
package com.zetcode @Deprecated("Use newFunction() instead", ReplaceWith("newFunction()")) fun oldFunction() { println("This is the old function") } fun newFunction() { println("This is the new function") } fun main() { oldFunction() // Warning: 'oldFunction()' is deprecated }
这里,我们使用消息和替换建议将 oldFunction
标记为已弃用。当使用此函数时,IDE 将显示警告。替换建议帮助用户迁移到新的 API。
创建自定义注解
自定义注解使用 annotation
关键字声明。它们可以应用于类、函数、属性和其他代码元素。注解可以具有带默认值的参数。
package com.zetcode annotation class Author(val name: String, val date: String = "2025") @Author(name = "Jan Bodnar", date = "2025-04-19") class Document { @Author(name = "Jan Bodnar") fun print() { println("Document printed") } } fun main() { val doc = Document() doc.print() }
我们创建了一个带有两个参数的 Author
注解。该注解同时应用于类和方法。日期参数有一个默认值。像这样的注解可以被文档工具处理。
注解目标规范
Kotlin 允许使用 @Target
指定注解可以应用于哪里。这确保了注解被正确使用,并防止误用于无效目标。
package com.zetcode @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) annotation class ApiEndpoint(val path: String) @ApiEndpoint("/users") class UserController { @ApiEndpoint("/list") fun listUsers() { println("Listing users") } } fun main() { val controller = UserController() controller.listUsers() }
ApiEndpoint
注解仅限于类和函数。尝试将其应用于属性会导致编译错误。这有助于保持一致的 API 设计。
注解保留策略
注解可以使用 @Retention
指定它们的保留策略。这决定了注解在运行时是否可用,或者仅在编译期间可用。
package com.zetcode @Retention(AnnotationRetention.RUNTIME) annotation class RuntimeVisible @Retention(AnnotationRetention.SOURCE) annotation class SourceOnly @RuntimeVisible @SourceOnly class TestClass fun main() { val annotations = TestClass::class.annotations annotations.forEach { println(it) } // Only shows RuntimeVisible }
这里,我们定义了两个具有不同保留策略的注解。只有 RuntimeVisible
在运行时可访问。SourceOnly
注解在编译后被丢弃,不会出现在反射中。
可重复注解
Kotlin 支持可重复注解,当使用 @Repeatable
标记时。这允许将相同的注解多次应用于单个元素。
package com.zetcode @Repeatable annotation class Tag(val name: String) @Tag("database") @Tag("performance") @Tag("security") class DatabaseService { fun connect() { println("Connecting to database") } } fun main() { val service = DatabaseService() service.connect() }
Tag
注解被标记为可重复,允许多个标签应用于 DatabaseService
类。此模式对于分类或将多个元数据属性添加到元素非常有用。
注解参数
注解参数可以是基本类型、字符串、枚举、其他注解或这些类型的数组。参数在注解的主构造函数中定义。
package com.zetcode enum class Priority { LOW, MEDIUM, HIGH } annotation class Scheduled( val cron: String, val priority: Priority = Priority.MEDIUM, val enabled: Boolean = true ) @Scheduled(cron = "0 * * * *", priority = Priority.HIGH) class BackgroundTask { fun execute() { println("Task executed") } } fun main() { val task = BackgroundTask() task.execute() }
Scheduled
注解演示了各种参数类型。它包括一个必需的 cron 表达式和可选的优先级和启用参数。默认值使某些参数在使用注解时变为可选。
注解使用站点目标
在 Kotlin 中,您可以在注解属性时指定注解的适用位置。这是使用带有 @
符号的使用站点目标完成的。
package com.zetcode annotation class Positive class Account { @set:Positive var balance: Int = 0 set(value) { require(value >= 0) { "Balance must be positive" } field = value } } fun main() { val account = Account() account.balance = 100 println("Balance: ${account.balance}") }
这里,@Positive
注解应用于 balance 属性的 setter。使用站点目标(如 @set
、@get
和 @field
)提供了对注解放置的精确控制。
注解的最佳实践
- 使用有意义的名称: 选择清晰的名称,反映注解的目的。
- 记录注解: 为自定义注解提供清晰的文档。
- 限制保留: 根据您的需要使用最低限度的保留级别。
- 验证参数: 考虑为注解参数添加验证逻辑。
- 遵循约定: 与内置注解保持一致的风格。
来源
本教程深入介绍了 Kotlin 的 annotation
关键字,展示了内置和自定义注解。我们探讨了各种注解特性,包括目标、保留和参数。正确使用注解可以增强代码文档并启用强大的元编程功能。
作者
列出 所有 Kotlin 教程。