关于java:Java注解改变了编程的体验

12次阅读

共计 2599 个字符,预计需要花费 7 分钟才能阅读完成。

前言

很长一段时间以来,Java 通过在其源代码中应用 Javadoc 正文标签,从而反对一种无限的元数据。应用 @deprecated 或 @author 这样的 Javadoc 标签,咱们能够向一个类、办法或字段增加一些信息,具体方法是将信息放入到这些项下面的正文中。在这种状况下,这些信息次要对 Javadoc 文档的生成器有用,因为正文只存在于 Java 源代码中。然而,开发者很长时间以来冀望一种形式可能生成元数据以用于其余的目标。实际上,有些工具曾经开发了很长一段时间了,它们能够读取正文中的各种 Javadoc 式的标签,并且用它们做各种各样的事件,包含代码生成和文档。在 Java 5.0 中,有一种叫作注解的正式的、可扩大的元数据系统增加到了语言中,它提供这种源代码层级的性能,以及在运行时应用元数据的新性能。

根本语法

如下是一个注解的定义。注解的定义看起来很像接口的定义。

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent { }

注解搁置在代码中,其后面有注解项,注解项应用一个 @ 符号,前面跟着注解的类名。除了 @ 符号之外,@Idempotent 的定义看起来更像一个空接口。注解的定义也须要一些元注解(meta-annoation),比方 @Target 和 @Retention。@Target 定义你的注解能够利用在哪里(例如是办法还是字段)。@Retention 定义了注解在哪里可用,在源代码中(SOURCE),class 文件(CLASS)中或者是在运行时(RUNTIME)。不蕴含任何元素的注解称为标记注解(marker annotation),例如上例中的 @Idempotent 就是标记注解。

上面是一个简略的注解。程序员能够应用该注解来标注满足特定用例的一个办法或者一组办法。而开发者在保护我的项目时能够轻松的找到用例用于更新,或者他们能够调试零碎中业务逻辑。

package com.annotation;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {
    /**
     * 幂等名称,作为 redis 缓存 Key 的一部分。*/
    String value();

    /**
     * 幂等过期工夫 (秒),即:在此时间段内,对 API 进行幂等解决。*/
    long expireMillis() default 5;}

留神 value 和 expireMillis 与办法定义相似。因为编译器会对 value 进行类型查看,因而将跟踪数据库与用例文档和源代码相关联是牢靠的形式。expireMillis 元素领有一个 default 值,如果在注解某个办法时没有给出 expireMillis 的值。则该注解的处理器会应用此元素的默认值。

在上面的类中,有三个办法被注解为用例:

package com.annotation;

public class Test {@Idempotent(value = "test1")
    public void test1() {}

    @Idempotent(value = "test2", expireMillis = 10)
    public void test2() {}

}

注解的元素在应用时体现为 名 - 值 对的模式,并且须要搁置在 @Idempotent 申明之后的括号内。在 test1() 办法的注解中,并没有给出 description 的值,所以在 @interface Idempotent 的注解处理器剖析解决这个类的时候会应用该元素的默认值。

注解不反对继承

你不能应用 extends 关键字来继承 @interfaces。如果反对继承,就会大大减少打字的工作量并且使得语法更整洁。在 Java 的将来版本中,仿佛没有任何对于让注解反对继承的提案。

规范注解

注解是 Java 5 中的一个新个性,最后有 3 个规范注解:Override、Deprecated 和 SupressWarnings,它们都定义在 java.lang 包中。

  • Override

是一种标记注解类型,可利用于办法,它通知编译器该办法是超类中一个办法的笼罩。这个注解类型能够避免程序员在笼罩办法时出错。

  • Deprecated

是一个标记注解类型,可利用于某个办法或某个类型,示意该办法或该类型已被弃用。被弃用的办法或类型由程序员标记,以正告编写代码的用户不应应用或笼罩该办法以及应用或扩大该类型。

  • SuppressWarnings

示意编译器应该针对注解的类或办法,克制指定的正告类型。

元注解

Java 语言中目前有 5 种规范注解(后面介绍过),以及 5 种元注解。元注解用于注解其余的注解

大多数时候,程序员定义本人的注解,并编写本人的处理器来解决他们。

自定义注解

编译器对于元素的默认值有些过于挑剔。首先,元素不能有不确定的值。也就是说,元素要么有默认值,要么就在应用注解时提供元素的值。

这里有另外一个限度:任何非根本类型的元素,无论是在源代码申明时还是在注解接口中定义默认值时,都不能应用 null 作为其值。这个限度使得处理器很难体现一个元素的存在或者缺失的状态,因为在每个注解的申明中,所有的元素都存在,并且具备相应的值。为了绕开这个束缚,能够自定义一些非凡的值,比方空字符串或者正数用于表白某个元素不存在。

// annotations/SimulatingNull.java
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {int id() default -1;
    String description() default "";}

这是一个在定义注解的习惯用法。

总结

注解是 Java 引入的一项十分受欢迎的补充,它提供了一种结构化,并且具备类型查看能力的新途径,从而使得你可能为代码中退出元数据,而且不会导致代码芜杂并难以浏览。Java 提供了很少的内置注解。这意味着如果你在别处找不到可用的类库,那么就只能本人创立新的注解以及相应的处理器。

正文完
 0