注释顺序重要吗?

Does annotations order matter?

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

此外,我们有时需要创建自定义注释。 (i.g。使用方面记录 enter/exit 给定 class 的所有 public 方法的跟踪 - @LogAroundMethods

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

@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 
}

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


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

Is there any impact or benefit from a specific order ?

我不知道。记住注解是如何工作的:代码中的一些代码 "looks",并检查是否存在注解。含义:它 "gets" 一组注释,并检查它关心的那个是否在该数组中。所以命令 should 是无关紧要的。

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

What's the recommended order of annotations?

适合您的那个。意思是:和你的团队坐下来,问问自己 "do we prefer a specific order"。如果是,请写下来,并让人们遵守该规则。

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

我们的 "solution": 注释必须按字母顺序排序(当用于此类 "property" 定义时)。我们甚至有一个单元测试来检查排序顺序。从那时起:所有 "property" 定义都遵循相同的规则。这对我们来说效果很好,因为每个人都有相同的期望和心态。

在几乎所有情况下,答案都是不,顺序没有影响。

但实际上有点复杂

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

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

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

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