【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.pswp.cn/web/70695.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70695.shtml
英文地址,請注明出處:http://en.pswp.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可能無法…