1. 概述

深入探讨Java中的interface@interface及其应用场景。接口(interface) 是实现类必须遵守的契约,最常见的形式是一组相关方法的空实现。而注解类型(@interface) 允许向代码添加元数据,供编译器、工具或框架使用,从而影响类的行为或处理逻辑。

2. 接口(interface)

接口作为实现类的契约存在。它仅规定实现类必须提供的行为,而不涉及具体实现方式。任何实现接口的类都必须为所有方法提供具体实现。

public interface Animal {
    String eat();
    String sleep();
}

public class Dog implements Animal {
    @Override
    public String eat() {
        return "Dog is eating";
    }

    @Override
    public String sleep() {
        return "Dog is sleeping";
    }
}

✅ 所有接口方法默认是publicabstractdefaultstatic方法除外),所有字段默认是publicstaticfinal。通过接口可实现:

  • 抽象化:接口仅暴露调用方法所需的关键信息,隐藏实现细节
  • 多重继承:类可实现多个接口,避免多继承中的菱形问题
  • 松耦合:接口在功能与实现间建立明确边界,类可修改内部实现而不影响使用者

3. 注解类型(@interface)

在Java中,使用@interface声明注解类型。注解为类、方法、字段等代码元素提供元数据,工具和库可在编译或运行时利用这些元数据进行代码处理。

创建自定义注解@Review,用于跟踪代码审查者和审查时间:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Review {
    String reviewer();
    String date() default "";
}

⚠️ 定义注解时需注意:

  1. 方法返回类型只能是基本类型、String、Class、枚举、注解或这些类型的数组
  2. 可为属性设置默认值(如date()
  3. 必须使用元注解指定保留策略(@Retention)和目标(@Target

使用示例:

@Review(reviewer = "Natasha", date = "2024-08-24")
public String service() {
    return "Some logic here";
}

4. 对比分析

对比维度 接口(interface) 注解类型(@interface)
核心用途 定义实现类必须遵守的契约 定义自定义注解
包含内容 方法签名、默认方法、静态方法、常量 提供元数据的注解方法
元注解 必需@Retention@Target
使用方式 由类实现(implements) 通过@符号标注代码元素
典型场景 实现抽象化、多重继承、解耦 框架配置、代码生成、验证、文档生成

5. 结论

理解interface@interface的区别对Java开发至关重要:接口用于定义类型和契约,注解类型则用于提供编译器或运行时的元数据。二者在代码设计中扮演不同角色,合理使用能显著提升代码质量和框架扩展性。

完整示例代码请查阅GitHub仓库


原始标题:What’s the Difference Between interface and @interface in Java? | Baeldung