一、前言
在 Java 程式語言中,介面 (
interface
) 扮演著至關重要的角色。它們定義了類別必須遵循的契約,並實現了多型和抽象。從 Java 7 到 Java 17,介面的概念本身沒有發生根本性的改變,但隨著 Java 的演進,介面也增加了許多新的特性,以提升開發效率和彈性。這些特性包括預設方法、靜態方法、私有方法,以及與 Lambda 表達式和函數式介面的整合等,使得介面不再只是抽象方法的集合,而是可以提供實作細節和更好地組織程式碼。本文將梳理 Java 7 至 Java 17 中關於介面的新特性,以便讀者更好地理解和使用介面。
目錄
- 一、前言
- 二、Java 7 及之前:傳統的介面
- 三、Java 8:預設方法 (Default Methods)、靜態方法 (Static Methods) 與函數式介面 (Functional Interface)
- 四、Java 9:私有介面方法 (Private Interface Methods)
-
五、關於
@interface
(Annotation): - 六、介面的演進與整合
二、Java 7 及之前:傳統的介面
在 Java 7 及之前,介面主要具有以下特性:
- 抽象方法: 介面只能定義抽象方法,這些方法沒有實作,必須由實作介面的類別來提供實作。
-
常數 (public static final):
介面中可以定義常數,這些常數都是
public static final
的。 - 類別必須實作所有方法: 實作介面的類別必須提供介面中所有抽象方法的實作。
傳統的介面主要用於定義契約,強制類別實作特定的方法。然而,這種設計有幾個缺點:
- 介面演化困難: 如果要在介面中新增一個方法,所有實作該介面的類別都必須修改,否則編譯會出錯。
- 程式碼重複: 有些實作邏輯可能會在多個類別中重複出現。
三、Java 8:預設方法 (Default Methods)、靜態方法 (Static Methods) 與函數式介面 (Functional Interface)
Java 8 引入了多個重要的介面特性,打破了介面只能包含抽象方法的限制,同時也引入了函數式介面的概念:
-
預設方法 (Default Methods):
- 允許在介面中定義具有預設實作的方法。
-
使用
default
關鍵字來宣告預設方法。 - 實作介面的類別可以繼承預設方法的實作,也可以選擇覆寫它們。
- 預設方法使得介面可以演化,在介面中新增方法時,不會強制所有實作類別都要修改程式碼。
- 預設方法主要用於擴展介面的功能,並提供一些通用實作。
範例:
輸出結果:
-
靜態方法 (Static Methods):
- 允許在介面中定義靜態方法。
- 靜態方法屬於介面本身,而不是介面的實例。
-
使用
static
關鍵字來宣告靜態方法。 -
靜態方法通常用於提供輔助方法或工具函數,例如
Collection.sort
,List.of
等等
範例:
輸出結果:
-
函數式介面 (Functional Interface):
- 函數式介面是指只包含一個抽象方法的介面。
-
使用
@FunctionalInterface
注解來標示函數式介面(可選,但建議使用)。 - Lambda 表達式可以用來實作函數式介面的抽象方法。
- 函數式介面與 Lambda 表達式的配合使用,使程式碼更簡潔、更具可讀性。
範例:
輸出結果:
四、Java 9:私有介面方法 (Private Interface Methods)
Java 9 引入了私有介面方法,可以幫助介面更好地組織程式碼,減少程式碼重複:
-
私有介面方法 (Private Interface Methods):
- 允許在介面中定義私有方法。
-
使用
private
關鍵字來宣告私有方法。 - 私有方法只能在介面內部使用,無法從介面外部存取。
- 私有方法通常用於讓介面中的預設方法或靜態方法共用一些輔助邏輯,避免程式碼重複。
範例:
輸出結果:
五、關於
@interface
(Annotation):
在 Java 中,
@interface
關鍵字
並不是用來標示介面
, 而是用來
宣告自訂的注解 (Annotation)
。
- Annotation 的用途: Annotation 是 Java 的一種元資料 (Metadata) 機制,它提供了一種為程式碼添加額外資訊的方式,這些資訊可以在編譯時期或執行時期被處理。Annotation 本身 不會 直接影響程式碼的執行邏輯,但它們可以被工具或框架使用來提供不同的功能(例如,編譯器檢查、程式碼生成、執行期行為修改)。
-
@interface
的作用: 在 Java 中,你可以使用@interface
關鍵字來定義你自己的 Annotation。這個關鍵字表明你正在定義一個 Annotation 型別,而不是一個普通的介面。
範例:
輸出結果:
六、介面的演進與整合
從 Java 10 到 Java 17,介面本身的功能沒有新增主要的語法變更。
然而,由於 Java 語言的整體發展,介面在程式碼中扮演的角色更加重要,與其他特性的整合也更加緊密,例如:
-
與函數式介面和 Lambda 表達式的整合:
- 函數式介面 (Functional Interface) 只能有一個抽象方法,可以用於 Lambda 表達式,讓程式碼更簡潔。
-
介面中的預設方法讓許多已存在的介面可以變成函數式介面,例如
Comparator
,Runnable
,Callable
-
與其他 API (例如 Stream API、Optional API) 更好的整合:
- 介面在現代的 Java API 中越來越常被使用,以便定義通用的操作。
總結
Java 的介面從最初的抽象契約,演變成了提供預設實作、工具方法、私有方法來組織程式碼,以及與 Lambda 和函數式介面整合的工具。 從 Java 7 到 Java 17,介面新增的預設方法、靜態方法、私有方法,以及函數式介面的引入,不僅解決了介面演化困難的問題,也讓介面的程式碼更有組織性,並且可以更好地與其他 Java 特性 (例如 Lambda、Stream API) 整合。
同時,也請務必區分
interface
(介面) 和
@interface
(注解) 這兩個概念。
@interface
才是用來定義自定義注解的關鍵字。
這些改進使得介面不再只是簡單的抽象定義,而是一種更強大、更靈活的程式設計工具。 理解介面在新版本中的這些特性變化,有助於開發人員寫出更清晰、更易維護的程式碼,同時也能更好地使用 Java 的最新功能。
沒有留言:
張貼留言