【问题标题】:Does annotations order matter?注释顺序重要吗?
【发布时间】:2020-01-03 16:37:37
【问题描述】:

如您所知,注释驱动的编程越来越多地融入我们现在使用的大多数框架(即 Spring、Lombok 等)中。

此外,我们有时需要创建自定义注解。 (例如,使用方面记录给定类的所有公共方法的进入/退出跟踪 - @LogAroundMethods

因此,给定的类可以包含大量注释。

@LogAroundMethod // My custom annotation
@Slf4j // Lombok annotation
@Component // Spring annotation
public class ClientNotificationProxy {
//Code
}

@LogAroundMethod // My custom annotation
@Configuration // Spring annotation
@ConditionalOnClass(NotificationSender.class) // Spring annotation
@EnableConfigurationProperties(MessagingProperties.class) // Spring annotation
@Import({ MongoConfiguration.class, SpringRetryConfiguration.class }) // Spring annotation
public class StarterClientAutoConfiguration {
// Code 
}
  • 推荐的注释顺序是什么?
  • 特定订单是否有任何影响或好处?

【问题讨论】:

  • 注释扫描器的顺序可能会影响事情;每个扫描仪都在寻找自己的注释。怪异:5个注释,然后{}
  • @JoopEggen,感谢您的评论。该课程包含我从问题中删除的几行。 (因为我们专注于注释)
  • 由于用于获取类注解的 Java 反射 API 不保证返回注解的任何特定顺序,所以 问题没有实际意义
  • 这是不正确的,安德烈亚斯。 docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/… 解释了订单的计算方式。

标签: java spring spring-boot annotations lombok


【解决方案1】:

在几乎所有情况下,答案都是不,订单无效。

但实际上要复杂一些。

  1. 考虑到注释处理器处理的注释,其他答案中已经说明它更多地取决于处理器运行的顺序。但是,处理器可以访问 AST,这允许它们确定源代码中注释的顺序。所以理论上注释处理器可以使生成的代码依赖于顺序,但我不知道这方面的任何例子,并称之为不好的做法。

  2. 在运行时获取元素的注释时,您也可以访问订单。 The docs 有更多关于如何确定订单的信息。同样,实现可以使其行为依赖于顺序。 我会再次考虑这种不好的做法。唯一的例外可能是可重复的注释,我可以想到这可能是合理的用例。

如果存在对注解顺序的依赖,这种可能性很小,这应该在注解的JavaDoc中说得很清楚。

因此,通常您可以随意订购它们。我不知道任何关于注释顺序的样式指南,所以对你来说合理吧。

【讨论】:

  • 感谢您的回答。我一直在寻找解释 Java 如何管理注释的文档,但您确定所有框架都重用 oracle 实现吗?因为据我了解,这会处理 Java 特定的注释(例如 Inject、Documented 等)
  • 根据 JLS,预定义和用户定义的注解没有区别。如果您使用 Oracle 编译器和 JVM,您可以确定它符合规范。当然,其他 JVM/编译器的行为可能会有所不同,但这会违反 JLS。
【解决方案2】:

特定订单有什么影响或好处吗?

我不知道。记住注释是如何工作的:一些代码“查看”您的代码,并检查是否存在注释。含义:它“获取”一组注释,并检查它关心的注释是否在该数组中。所以顺序应该是无关紧要的。

当然,当我们谈论具有编译时效果的注解时,情况可能会有所不同。这样的注释会对编译过程本身产生影响,所以最坏的情况是,注释的顺序会改变编译过程。

建议的注释顺序是什么?

适合您的。含义:与您的团队坐下来,问自己“我们是否更喜欢特定的订单”。如果是这样,请将其写下来,并让人们遵守该规则。

现实世界的例子:我们使用注释来“描述”我们的“对象”的“属性”。在某些时候,我们看到我们在添加新属性时经常忘记注释 X。因为属性是按随机顺序写下来的,因此很难手动处理(而且我们有很多不同的注释,有时单个属性上有 5 到 10 个)。

我们的“解决方案”:注释必须按字母顺序排序(当用于此类“属性”定义时)。我们甚至有一个检查排序顺序的单元测试。从那时起:所有“财产”定义都遵循相同的规则。这对我们很有效,因为每个人都有相同的期望和心态。

【讨论】:

  • 感谢您的完整回答。
【解决方案3】:

特定订单是否有任何影响或好处?” - 据我所知,没有。正如 Joop Eggen 所指出的,注释处理器或注释扫描器的顺序是重要的部分。


"推荐的注释顺序是什么?" - 如果能够识别出通常一起使用的注释模式,我建议将它们分组到一个新的注释中,并改用新的注释.可以通过创建一个新的publice @interface MyAnnotation 并使用想要分组的注释来注释这个新注释来实现这一点。示例见this answer

【讨论】:

  • 感谢您对重新组合注释的建议。它将增强代码的可读性。
猜你喜欢
  • 2016-01-08
  • 1970-01-01
  • 2014-08-06
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2012-06-27
相关资源
最近更新 更多