Skip to content

Update 23-Annotations.md #346

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 6, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions docs/book/23-Annotations.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# 第二十三章 注解

注解(也被成为元数据)为我们在代码中添加信息提供了一种形式化的方式,使我们可以在稍后的某个时刻更容易的使用这些数据。
注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方式,使我们可以在稍后的某个时刻更容易的使用这些数据。

注解在一定程度上是把元数据和源代码文件结合在一起的趋势所激发的,而不是保存在外部文档。这同样是对像 C# 语言对于 Java 语言特性压力的一种回应。

Expand All @@ -20,7 +20,7 @@

还有 5 种额外的注解类型用于创造新的注解。你将会在这一章学习它们。

每当创建涉及重复工作的类或接口时,你通常可以使用注释来自动化和简化流程。例如在 Enterprise JavaBean(EJB)中的许多额外工作就是通过注解来消除的。
每当创建涉及重复工作的类或接口时,你通常可以使用注解来自动化和简化流程。例如在 Enterprise JavaBean(EJB)中的许多额外工作就是通过注解来消除的。

注解的出现可以替代一些现有的系统,例如 XDoclet,它是一种独立的文档化工具,专门设计用来生成注解风格的文档。与之相比,注解是真正语言层级的概念,以前构造出来就享有编译器的类型检查保护。注解在源代码级别保存所有信息而不是通过注释文字,这使得代码更加整洁和便于维护。通过使用拓展的 annotation API 或稍后在本章节可以看到的外部的字节码工具类库,你会拥有对源代码及字节码强大的检查与操作能力。

Expand Down Expand Up @@ -120,7 +120,7 @@ Java 语言中目前有 5 种标准注解(前面介绍过),以及 5 种元
| @Target | 表示注解可以用于哪些地方。可能的 **ElementType** 参数包括:<br/>**CONSTRUCTOR**:构造器的声明<br/>**FIELD**:字段声明(包括 enum 实例)<br/>**LOCAL_VARIABLE**:局部变量声明<br/>**METHOD**:方法声明<br/>**PACKAGE**:包声明<br/>**PARAMETER**:参数声明<br/>**TYPE**:类、接口(包括注解类型)或者 enum 声明 |
| @Retention | 表示注解信息保存的时长。可选的 **RetentionPolicy** 参数包括:<br/>**SOURCE**:注解将被编译器丢弃<br/>**CLASS**:注解在 class 文件中可用,但是会被 VM 丢弃。<br/>**RUNTIME**:VM 将在运行期也保留注解,因此可以通过反射机制读取注解的信息。 |
| @Documented | 将此注解保存在 Javadoc 中 |
| @Interited | 允许子类继承父类的注解 |
| @Inherited | 允许子类继承父类的注解 |
| @Repeatable | 允许一个注解可以被使用一次或者多次(Java 8)。 |

大多数时候,程序员定义自己的注解,并编写自己的处理器来处理他们。
Expand Down Expand Up @@ -271,7 +271,7 @@ public @interface SQLInteger {

另外两个 **@interface** 定义的是 SQL 类型。如果希望这个框架更有价值的话,我们应该为每个 SQL 类型都定义相应的注解。不过为为示例,两个元素足够了。

这些 SQL 类型具有 `name()` 元素和 `constraints()` 元素。后者利用了嵌套注解的功能,将数据库列的类型约束信息嵌入其中。注意 `constraints()` 元素的默认值时 **@Constraints**。由于在 **@Constraints** 注解类型之后,没有在括号中指明 **@Constraints** 元素的值,因此,**constraints()** 的默认值为所有元素都为默认值的 **@Constraints** 注解。如果要使得嵌入的 **@Constraints** 注解中的 `unique()` 元素为 true,并作为 `constraints()` 元素的默认值,你可以像如下定义:
这些 SQL 类型具有 `name()` 元素和 `constraints()` 元素。后者利用了嵌套注解的功能,将数据库列的类型约束信息嵌入其中。注意 `constraints()` 元素的默认值是 **@Constraints**。由于在 **@Constraints** 注解类型之后,没有在括号中指明 **@Constraints** 元素的值,因此,**constraints()** 的默认值为所有元素都为默认值的 **@Constraints** 注解。如果要使得嵌入的 **@Constraints** 注解中的 `unique()` 元素为 true,并作为 `constraints()` 元素的默认值,你可以像如下定义:

```java
// annotations/database/Uniqueness.java
Expand Down