Oracle JDK 8引入了许多常用注解,下面列举一些主要的注解、它们的功能以及优缺点,并提供一些简单的示例。
-
@Override:
- 功能: 表示一个方法是覆盖父类的方法。
- 优点: 编译器能够检测到是否正确地覆盖了父类的方法。
- 缺点: 如果父类的方法签名发生变化,可能导致编译错误。
class Parent { void doSomething() {} } class Child extends Parent { @Override void doSomething() { // 子类实现 } }
-
@Deprecated:
- 功能: 表示某个元素(类、方法等)已过时,不再推荐使用。
- 优点: 提醒开发者不要再使用过时的元素。
- 缺点: 不会阻止开发者使用过时的元素。
class DeprecatedExample { @Deprecated void oldMethod() { // 过时的方法实现 } }
-
@SuppressWarnings:
- 功能: 抑制编译器警告。
- 优点: 用于消除某些情况下不必要或者不适用的警告。
- 缺点: 可能掩盖了潜在的问题。
class SuppressWarningExample { @SuppressWarnings("unchecked") void uncheckedOperations() { // 执行一些类型不安全的操作 } }
-
@FunctionalInterface:
- 功能: 表示接口是一个函数式接口,即只包含一个抽象方法的接口。
- 优点: 提醒开发者该接口应该用于Lambda表达式。
- 缺点: 如果添加了多个抽象方法,编译器将报错。
@FunctionalInterface interface MyFunctionalInterface { void myMethod(); }
-
@SafeVarargs:
- 功能: 用于抑制关于使用可变参数的警告。
- 优点: 提高代码的可读性,消除不必要的警告。
- 缺点: 只能用于静态方法或者 final 实例方法。
class SafeVarargsExample { @SafeVarargs final void processItems(List<String>... items) { // 处理可变参数 } }
-
@Repeatable:
- 功能: 用于支持可重复注解。
- 优点: 允许一个元素可以多次使用相同的注解。
- 缺点: 增加了代码的复杂性。
@Repeatable(MyAnnotations.class) @interface MyAnnotation { String value(); } @interface MyAnnotations { MyAnnotation[] value(); } @MyAnnotation("Annotation 1") @MyAnnotation("Annotation 2") class RepeatableExample { // 类体 }
-
@Retention:
- 功能: 用于指定注解的保留策略,即注解在什么级别可用,有 SOURCE、CLASS 和 RUNTIME 三个级别。
- 优点: 允许开发者根据需要指定注解的生命周期。
- 缺点: 使用不当可能导致注解在运行时不可用。
@Retention(RetentionPolicy.RUNTIME) @interface MyRuntimeAnnotation { String value(); }
-
@Target:
- 功能: 用于指定注解可以应用的程序元素的种类,包括 TYPE、FIELD、METHOD 等。
- 优点: 增强了注解的限制和使用范围。
- 缺点: 使用不当可能导致注解无法应用到期望的元素上。
@Target(ElementType.METHOD) @interface MyMethodAnnotation { String value(); }
-
@Resource:
- 功能: 用于标注字段或方法,指定由名称来注入资源。
- 优点: 简化了依赖注入的过程。
- 缺点: 只能注入命名的资源,对于按类型注入的场景不适用。
public class ResourceExample { @Resource(name = "myDataSource") private DataSource dataSource; @Resource public void setLogger(Logger logger) { // 设置Logger } }