Java中的interface和@interface有什麼差別?
1. 概述
讓我們深入了解什麼是interface
和@interface
以及它們的應用程式。 interface
是實現它的類別的契約。最常見的形式是一組具有空體的相關方法。
另一方面, @interface
允許您將元資料新增至程式碼。編譯器、工具或框架使用此元資料來影響類別行為或處理。
2. interface
interface
作用類似於其實作類別的契約。它指定其實作類別必須實現的行為,但不指定如何實作。它表明任何實作該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";
}
}
所有interface
方法都是隱式public
和abstract
( default
和static
方法除外),並且所有欄位都是public
、 static
和final
。我們可以使用介面在Java中實現抽象、多重繼承和鬆散耦合。
抽象: interface
僅揭示呼叫方法所需的基本訊息,而實現的複雜性仍然被隱藏。
多重繼承:一個類別可以實現多個接口,從而避免了允許類別多重繼承的語言中可能出現的鑽石問題。
鬆散耦合:介面在功能和實作細節之間提供了明顯的分離。它使類別能夠改變其內部流程而不影響其用戶,因為我們分別定義方法和簽名。
3. @interface
在Java中,我們使用@interface
來聲明註解類型。註解提供了一種將元資料新增至 Java 程式碼元素(例如類別、方法和欄位)的方法。因此,工具和函式庫可以利用此元資料在編譯過程或程式碼處理執行時收集資訊。
讓我們建立一個@Review
自訂註釋,我們可以使用它來追蹤誰審閱了一段程式碼以及何時審查:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Review {
String reviewer();
String date() default "";
}
請注意,當使用 @interface 定義Review
註解時@interface
我們將其定義為常規interface
。我們有使用原始資料類型甚至數組的方法名稱和傳回類型。但是,我們不能使用複雜物件作為傳回類型。
此外,我們需要在使用Review
註解時為所有上述定義的屬性提供值。有一種方法可以在聲明時定義預設值。如果我們在使用註解時並不總是需要提供的值,則可以使用它。
另外,也要注意的一件事是@interface
定義上方的[@Retention](https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/annotation/RetentionPolicy.html)
和[@Target](https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/ElementType.html)
註解。 @Retention(RetentionPolicy.SOURCE)
註解使我們的註解在原始程式碼中可用。 @Target @Target({ElementType.METHOD})
註解指定Review
註解將僅套用於 Java 類別中的方法。
現在,讓我們在服務方法中使用@Review
註解:
@Review(reviewer = "Natasha", date = "2024-08-24")
public String service() {
return "Some logic here";
}
4. 比較
方面 | interface |
@interface |
---|---|---|
目的 | 用於定義類別可以實現的契約。 | 用於定義自訂註釋。 |
包含 | 沒有實作的方法簽章、預設方法、靜態方法和常數。 | 提供元資料的註釋方法。 |
@Retention:指定保留註解。 | ||
@Target:指定註解類型適用的程式元素。 |
|
| 用法 | 由類別實作以提供特定的行為。 | 用於註解程式碼元素(類別、方法、欄位等)以提供元資料。 |
| 使用案例 | 實作 Java 中的抽象、多重繼承以及方法與其實作的解耦。 | 定義可為支援程式碼文件、配置、程式碼產生和驗證的框架提供元資料的自訂註解。 |
5. 結論
理解interface
和@interface
之間的區別至關重要,因為它們在Java程式設計中扮演著不同的角色。 interface
是關於定義類型和契約的。 @interface
是為了向編譯器或執行時間提供元資料。
上述範例的完整原始程式碼可在 GitHub 上取得。