隔离注解的实例化

Isolate the instantiation of an annotation

我有一个巨大的 @OpenApi 注释(基本上它是 Javalin/Kotlin 端点的文档),它占用了很多行:

@OpenApi(
   summary = "",
   description = "Lists all customers",
   path = "customers",
   queryParams =
   // ...........
   // ...........
   // etc
)
override fun handle(context: Context) {
   // body of the REST handler
}

我必须滚动很多才能看到实际的处理程序。 因此,我想以某种方式隔离它:

@GetCustomersDoc
override fun handle(context: Context) {
   // body of the REST handler
}

我同意将文档移到其他地方的其他解决方案。

这将使代码更清晰,文档也更独立。

好的,所以您想要的是 @OpenApi 文档与 REST 处理程序代码分开。您可以通过移除实现而不是移除注释来做到这一点。

因此,在所有 @OpenApi 注释与 REST 处理程序代码混合的当前文件中,您调用辅助函数,如下所示:

@OpenApi(
   summary = "",
   description = "Lists all customers",
   path = "customers",
   queryParams =
   // ...........
   // ...........
   // etc
)
override fun handle(context: Context) {
   handleGetCustomers(context)
}

然后您将所有 REST 处理程序放在该文件的顶部或另一个文件中以进行更多隔离,这使您可以在它们之间滚动而不会受到 @OpenApi 注释的干扰:

// Collected at the top of the file, or in a separate file
fun handleGetCustomers(context: Context) {
    // body of the REST handler
}

然后您可以轻松地在 REST 处理程序代码之间滚动,而不会被 @OpenApi 噪音打扰。

请注意,您应该使用 Go To -> Definition 功能 Android Studio 以避免必须滚动到handleGetCustomers().

您可以定义单独的注释:

annotation class MyOwnApi(
    val openApi: OpenApi = OpenApi(
          summary = "",
          description = "Lists all customers",
          path = "customers",
          queryParams =
          // ...........
          // ...........
          // etc
        )
)

annotation class UserOpenApi(
        val openApi: OpenApi = OpenApi(
              summary = "Something",
              description = "Lists all users",
              // ...........
              // ...........
              // etc
            )
    )

优点:

  • 代码分离
  • 可重用注释 classes
  • 您甚至可以制作一个构建器 class 并对其进行测试

缺点:

  • 令人困惑
  • 注释不能继承、扩展classes 或实现接口
  • 如果 classes/objects 直接检查 @OpenApi
  • 可能无法 实施或需要复杂的代码更改。在这种情况下,您将需要另一个反射搜索来从字段中提取注释!