【Java 基础】-- Java 接口中的 @Public 和 @FunctionalInterface 注解详解

目录

Java 接口中的 @Public 和 @FunctionalInterface 注解详解

1. 概述

2. @Public 注解的作用

3. @Public 注解的使用

3.1 基本使用方式

3.2 应用于类和方法

4. @FunctionalInterface 注解的作用

4.1 主要作用

4.2 @FunctionalInterface 使用示例

4.3 允许默认方法

5. @Public 与 @Internal 的对比

6. @Public 与 @FunctionalInterface 适用场景

6.1 @Public 适用场景

6.2 @FunctionalInterface 适用场景

7. 最佳实践

7.1 @Public 最佳实践

7.2 @FunctionalInterface 最佳实践

8. 结论


Java 接口中的 @Public@FunctionalInterface 注解详解

1. 概述

在 Java 开发中,@Public@FunctionalInterface 注解用于标识接口的特定用途和可访问性。@Public 主要用于标识某些 API 或接口对外部用户是公开的,而 @FunctionalInterface 则用于表明该接口是一个符合 Java 8 及以上版本的函数式接口。本篇文章将详细介绍这两个注解的作用、使用场景以及最佳实践。

2. @Public 注解的作用

@Public 并非 Java 官方提供的标准注解,而是某些框架或 API(如 Apache Flink)中自定义的注解,用于表明某些接口或类是公共 API,供外部使用,而非内部实现。

在 Apache Flink 及类似的库中,@Public 主要用于:

  • 标识稳定的 API,即可以供用户直接使用的 API。
  • 避免内部 API 被误用,帮助开发者区分公共 API 和内部实现。
  • 提供 API 兼容性保障,确保带有 @Public 注解的 API 在未来版本中不会轻易变更。

3. @Public 注解的使用

3.1 基本使用方式

通常,@Public 注解会应用于接口、类或方法,以表明它们是公共 API。例如:

import org.apache.flink.annotation.Public;@Public
public interface MyPublicInterface {void execute();
}

在上述示例中,@Public 注解表明 MyPublicInterface 是一个稳定的 API,供外部用户使用。

3.2 应用于类和方法

@Public 也可以用于类或方法,标识哪些部分对外部可用。例如:

import org.apache.flink.annotation.Public;@Public
public class MyPublicClass {@Publicpublic void myPublicMethod() {System.out.println("This is a public API method.");}
}

4. @FunctionalInterface 注解的作用

@FunctionalInterface 是 Java 8 引入的标准注解,用于标识一个接口是“函数式接口”(Functional Interface)。函数式接口是指 只包含一个抽象方法 的接口,可用于 Lambda 表达式或方法引用。

4.1 主要作用

  • 确保接口符合函数式接口的规范,如果接口不止一个抽象方法,编译器会报错。
  • 增强代码可读性,让开发者明确该接口是函数式接口。
  • 支持 Lambda 表达式,使代码更简洁。

4.2 @FunctionalInterface 使用示例

@FunctionalInterface
public interface MyFunctionalInterface {void execute();
}public class FunctionalTest {public static void main(String[] args) {MyFunctionalInterface func = () -> System.out.println("Executing functional interface!");func.execute();}
}

在上述示例中:

  • MyFunctionalInterface 只有一个抽象方法 execute(),符合函数式接口的定义。
  • @FunctionalInterface 确保该接口不会被误修改成非函数式接口。
  • Lambda 表达式 () -> System.out.println("Executing functional interface!") 使代码更简洁。

4.3 允许默认方法

尽管函数式接口只能有一个抽象方法,但可以包含多个 defaultstatic 方法。例如:

@FunctionalInterface
public interface MyFunctional {void execute();default void print() {System.out.println("This is a default method in a functional interface.");}
}

5. @Public@Internal 的对比

在某些框架(如 Flink)中,除了 @Public,还有 @Internal 注解,二者的主要区别如下:

注解作用
@Public表示该类或方法是公共 API,外部用户可以使用,并保证未来版本的兼容性
@Internal仅供框架内部使用,外部用户不应依赖这些 API,未来版本可能会变更或移除

示例:

import org.apache.flink.annotation.Internal;@Internal
class InternalClass {void internalMethod() {System.out.println("This is an internal method.");}
}

上述 InternalClass 仅供内部使用,不对外部用户开放。

6. @Public@FunctionalInterface 适用场景

6.1 @Public 适用场景

  • 开源框架 API 设计:如 Flink、Hadoop 需要提供稳定的 API。
  • 企业级 SDK 设计:确保外部开发者不会误用内部 API。
  • 版本兼容性管理:保证 API 的稳定性。

6.2 @FunctionalInterface 适用场景

  • Lambda 表达式的使用:简化回调函数、事件处理、线程任务等。
  • 流式处理(Stream API):在 map(), filter(), forEach() 等方法中使用 Lambda 表达式。
  • 方法引用:简化代码,提高可读性。

7. 最佳实践

7.1 @Public 最佳实践

  • 仅在确定 API 需要对外公开时使用 @Public
  • 配合 @Internal 使用,区分公共 API 和内部 API。
  • 文档化所有 @Public API,确保用户可以正确使用。
  • 提前考虑 API 的向后兼容性,避免破坏性变更。

7.2 @FunctionalInterface 最佳实践

  • 始终确保接口只有一个抽象方法
  • 适当使用 default 方法,扩展功能但不影响 Lambda 兼容性。
  • 避免额外的非必要方法,保持接口的函数式特性。

8. 结论

@Public@FunctionalInterface 都是 Java 开发中非常有用的注解。

  • @Public 主要用于标识稳定的 API,确保版本兼容性。
  • @FunctionalInterface 用于声明函数式接口,使其能够与 Lambda 表达式兼容。

合理使用这些注解,可以提高 API 设计的清晰度,减少错误,增强代码的可维护性和可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/70695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go语言环境下载与配置(Windows)

下载 Go下载 - Go语言中文网 - Golang中文社区 建议在D盘中创建文件夹安装到 D 盘 ,方便进行管理,然后进行傻瓜式安装。 安装 验证安装 go version 安装成功 配置环境变量 winE --> 右击此电脑 --> 选择属性 --> 高级系统设置 --> 点击…

nss刷题5(misc)

[HUBUCTF 2022 新生赛]最简单的misc 打开后是一张图片,没有其他东西,分离不出来,看看lsb,红绿蓝都是0,看到头是png,重新保存为png,得到一张二维码 扫码得到flag [羊城杯 2021]签到题 是个动图…

OkHttp、Retrofit、RxJava:一文讲清楚

一、okHttp的同步和异步请求 Call 是 OkHttp 的核心接口,代表一个已准备好执行的 HTTP 请求。它支持 同步 和 异步 两种模式: enqueue——>okHttp异步 OkHttpClient client new OkHttpClient();Request request new Request.Builder().url("…

Redis分布式缓存面试题

为什么使用分布式缓存? 1. 提升性能 降低延迟:将数据缓存在离应用更近的地方,减少数据访问时间。减轻数据库压力:缓存频繁访问的数据,减少对后端数据库的请求,提升系统响应速度。 2. 扩展性 水平扩展&a…

基于阿里云PAI平台快速部署DeepSeek大模型实战指南

一、DeepSeek大模型:企业级AI应用的新标杆 1.1 为什么选择DeepSeek? 近期,DeepSeek系列模型凭借其接近GPT-4的性能和开源策略,成为全球开发者关注的焦点。在多项国际评测中,DeepSeek-R1模型在推理能力、多语言支持和…

C++---了解STL

上节学习了模板,那么就得谈到C的标准模板库STL。 C98:以模板方式重写了C标准库,引入了STL(标准模板库)。 1.概念 STL(Standard template Libarary)标准模板库:是C标准库的重要组成部分,不仅是一个可复用的组件库&am…

分享几款比较常用的接口测试工具

首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你…

Qt layout

文章目录 Qt layout**关键机制****验证示例****常见误区****最佳实践****总结**关键点总结:示例代码说明:结论: Qt layout 在 Qt 中,当调用 widget->setLayout(layout) 时,layout 的父对象会被自动设置为该 widget…

flutter: table calendar笔记

pub dev:table_calendar 3.2.0 我来详细解释 TableCalendar 是如何根据不同的 CalendarFormat 来显示界面的。主要逻辑在 CalendarCore 中实现。 核心逻辑分为以下几个部分: 页面数量计算 - _getPageCount 方法根据不同格式计算总页数: in…

【C++】各个版本新的特性和改进

C 语言自从其诞生以来,经历了多个版本的更新,每个版本都引入了新的特性和改进,目的是提升语言的表达能力、性能、安全性以及开发效率。下面是各个主要版本(从 C98 到 C20)的一些关键特性。 C98 (1998年) ISO C 标准化…

C++模板与STL七日斩:从工业编程到高效数据管理(工业项目)

模板如何提升工业代码复用性 实战项目&#xff1a;创建通用【工业设备容器】模板类 类模板的定义与实例化模板参数默认值 #include <iostream> #include <string> using namespace std;template <typename T string> class IndustrialContainer { priva…

sh脚本把服务器B,服务器C目录的文件下载到服务器A目录,添加开机自启动并且一小时执行一次脚本

脚本逻辑 第一次会下载,第二次比较如果有就不下载 文件已存在&#xff1a; 如果目标目录中已经存在同名文件&#xff0c;rsync 会比较源文件和目标文件的大小和修改时间。 如果源文件和目标文件的大小和修改时间完全相同&#xff0c;rsync 会跳过该文件&#xff0c;不会重新下载…

云手机如何进行经纬度修改

云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异&#xff0c;以下是综合多个来源的常用方法及注意事项&#xff1a; 通过ADB命令注入GPS数据&#xff08;适用于技术用户&#xff09; 1.连接云手机 使用ADB工具连接云手机服务器&#xff0c;…

透彻理解:方差、协方差、相关系数、协方差矩阵及其应用

最近看了几篇跨领域特征对齐方面的经典文献&#xff0c;学者们搞了很多花样&#xff0c;如有的提出一阶统计特征对齐&#xff0c;有的提出二阶统计特征对齐&#xff0c;有的学者提出高阶统计特征对齐。 通俗而言&#xff0c;就是在统计特征层面对跨域特征进行对齐&#xff0c;…

Unity基础学习(二)

二、Mono中的重要内容 1、延迟函数 &#xff08;1&#xff09;延迟函数定义 延迟执行的函数&#xff0c;可以设定要延迟执行的函数和具体延迟的时间 &#xff08;2&#xff09;延迟函数的使用 #region 1、延迟函数//函数&#xff1a;Invoke(函数名/字符串&#xff0c;延迟时…

20250212:ZLKMedia 推流

1:资料 快速开始 ZLMediaKit/ZLMediaKit Wiki GitHub GitHub - ZLMediaKit/ZLMediaKit: WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT server and client framework based on C++11 文档里面提供了各个系…

Holoens2开发报错记录02_通过主机获取彩色和深度数据流常见错误

01.E1696 E1696 无法打开源文件 “stdio.h” 解决方法&#xff1a; 更新一下SDK 1&#xff09;打开Visual Studio Installer&#xff0c;点击修改 2&#xff09;安装详细信息中自己系统对应的SDK&#xff0c;点击修改即可 02.WinError 10060 方法来源 解决方法&#xff1a…

【Qt之QQuickWidget】QML嵌入QWidget中

由于我项目开始使用Widgets,换公司后直接使用QML开发&#xff0c;没有了解过如何实现widget到qml过渡&#xff0c;恰逢面试时遇到一家公司希望从widget迁移到qml开发&#xff0c;询问相关实现&#xff0c;一时语塞&#xff0c;很尴尬&#xff0c;粗略研究并总结下。 对qwidget嵌…

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯

目录 前言 HAL库对GPIO的抽象 核心分析&#xff1a;HAL_GPIO_Init 前言 我们终于到达了熟悉的地方&#xff0c;对GPIO的初始化。经过漫长的铺垫&#xff0c;我们终于历经千辛万苦&#xff0c;来到了这里。关于GPIO的八种模式等更加详细的细节&#xff0c;由于只是点个灯&am…

ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?

目录 基于ESP32S3:解决RWDT无法触发中断问题引言解决方案1. 查看报错日志2. 分析报错及一步一步找到解决方法3.小结我的源码基于ESP32S3:解决RWDT无法触发中断问题 引言 在嵌入式系统中,RWDT(看门狗定时器)是确保系统稳定性的重要组件。然而,在某些情况下,RWDT可能无法…