ABC:从字母表入手学习Java注释


如果你已经掌握英语字母表,而且你已经掌握了 Java 基础知识,让我们带你踏上 Java 注释之旅,一次一个字母。

A代表@Autowired
这听起来很方便,你只需添加一个注释,类中的所有字段就会神奇地初始化。但是这些值从哪里来的呢?

B代表@Bean
啊哈,所以这些值就是从这里来的。也许我们只需要找到一个用 注释的方法@Bean。你可以去尝试@Bean构造,但前提是你必须阅读并理解这里写的所有内容。

C代表@Component(Scan)
也许吧,但如果没有这样的方法,那么值就来自其他地方。是的,您还可以通过在代码库中的某个地方添加带有注释的类来更改程序的整个行为。当它自动完成时,这太过分了,我不是唯一一个这样想的人。

D代表@Deprecated
现在,这里有一个不会让 Sergey 大叔伤心的注释!它不会引入任何魔法。相反,它以一致的方式传达有关一段程序结构的信息,允许您以编程方式对其进行操作,而不必影响运行时行为。

E代表@Email
现在你的朋友都不再使用电子邮件了。然而电子邮件却无处不在。有时,你只是不想知道这些正则表达式中哪一个用于电子邮件验证。直到你知道为止。至少,我还没有见过@HTML。

F代表@FunctionalInterface
你的 Sergey 叔叔对此犹豫不决。是的,这只是元数据,但这些元数据有用吗?我猜如果你正在构建一个库,额外的编译时检查不会有什么坏处。

G代表@Generated
理想情况下,它应该遵循与其他所有内容相同的样式指南、格式规则和检查。但是,我们无法为每个人的代码库重写生成器,所以至少我们知道如何禁用这些类的检查,如果我们可以通过构造来保证它们的安全性。

H代表@HeaderParam
我们成年人通常很懒,但说实话,req.getHeader写代码不会花那么多时间。另外,您的 IDE 将通过自动完成功能确保良好的 API 可发现性。

I代表@Inject
好吧,也许我们在这里绕了一大圈,但我们甚至还没有读完字母表的一半。

J代表@JsonProperty
将数据模式与类字段一起描述确实很方便。但请考虑以这种方式声明的模式可能会成为您的事实来源,在这种情况下它将以 Java 为中心。但如果模式是在其他地方声明的,那么注释的类很可能会自动生成,此时,为什么不生成性能更高的代码呢?

K代表@KeyFor
静态分析可以提供帮助,注释是一种不错的工具,可帮助您尽早纠正错误。然而,在某些时候,维护这些检查的成本可能会超过其优点。如果您必须依靠注释映射的键,请考虑是否有办法用更严格的类型重写代码。

L代表@Log4j
有人已经明确表示应该将其视为一种单独的语言,我同意他们的观点。

M代表@Mock
你不想每次在不改变代码逻辑的情况下更改代码结构时都更新测试。与其使用 mock,不如使用 fake,这样你就可以测试状态,而不是交互。@DoNotMock这是我最近最喜欢的注释。

N代表@Nullable
啊,价值百万美元的朋友:NullPointerException。添加此元数据非常好,只要它是一致的,并且可能使用NullAway之类的工具强制执行。否则,您将无法信任它。

O代表部分是元数据
部分是JLS@Override中提到的语言特性。如果您使用 IDE,您将永远不需要手动输入它。

P代表@Profile
由于声明式 Spring 连接不够灵活,现在我们有了声明式if条件。至少配置不再存储在 XML 中。

Q代表@Qualifier
可怕的是,有了这个注释,你可以创建自己的自定义限定符注释。我称之为递归魔法。

R代表@RestController
与@Component有一点不同。我很高兴看到越来越多的框架正在转向函数式方法,这种方法虽然不那么神奇,但是一种很好的方法。

S代表@SuppressWarnings
如果您没有因为警告而导致构建失败,警告很快就会变得毫无意义,这使得此注释成为必要之恶。

T代表@Transactional
我浪费了很多时间在@Transactional私有方法的调试上。

U代表@Untainted
污点检查是一个非常有趣的概念。有些语言是围绕它构建的,比如这个项目:Jeeves 。但在 Java 中,老实说,我更喜欢 Google使用类型来实现污点检查的方式。

V代表@VisibleForTesting
从表面上看,这个注释听起来很有用:将机器可读的元数据附加到程序结构的一部分。但实际上,它可以通过使次优选择合法化来鼓励捷径。如果可以的话,请避免将测试与类的实现细节从外部耦合。

W代表@WebAppConfiguration
我想我曾经用过这个。我不认为我当时完全理解它的作用。我希望我只是编写了普通的旧代码。

X代表@XmlElement
我们已经讨论了在代码中声明模式的问题。不过,现在,如果您正在解析 XML,则更有可能读取特定文件格式,而不是与其他系统集成。

Y代表@YamlProperty
和以前一样。不过,在决定使用此注释之前,请务必查看noyaml.com 。

Z代表@Z...
你总有一天会自己写一个。

总有一天你得自己写元注释, 也许你会遇到一个真正有用的问题,那就是将元数据附加到程序结构的一部分--比如用 @Beta 标记不稳定的 API,并以编程方式强制执行其使用规则。 但不要为了省几行代码而创建一个新注解。 先做一次,了解神奇框架的工作原理,然后就不要再做了。 神奇的捷径几乎从来不值得一试。