Java 接口命名約定
一、簡介
Java 中的接口是一個核心概念,通常用於定義契約、實現多態性或簡單地創建新的抽象層。命名接口是開發更具可讀性的代碼的重要步驟。
在本教程中,我們將了解 Java 中接口的命名約定。
2. Java接口命名約定
首先,讓我們記住 Java 中接口的基本用途。如果我們探索 Java 內部庫的源代碼,我們將遇到兩個主要用例。
它通常用作其他類的功能或實現多態性。在這兩種情況下,Java 都有命名約定。
特殊情況下,函數式接口不遵循特定的命名模式,因此我們不會在這裡討論它們。
2.1.接口作為一種能力
功能定義了對像在實現接口後可以執行的操作。在這種情況下,約定接口名稱是形容詞。
Comparable
接口是遵循形容詞約定的功能的一個很好的示例:
public interface Comparable<T>
Integer
類是一種Comparable
實現,它具有以下簽名:
public final class Integer implements Comparable<Integer>
這意味著Integer
定義了一個能夠與另一個Integer
進行比較的對象。
以形容詞命名的接口的其他示例是Runnable
和Callable
接口。它們定義了對像在多線程編程中用作任務的能力。
2.2.作為多態類型的接口
Java 庫中另一個廣泛使用的模式是多態性。實現它的一種方法是使用接口作為具有兩個或多個實現的超類型。
實現多態性時,約定接口名稱是名詞。此外,它們的子類的名稱結合了它們的專業和接口名稱。為了說明這一點,讓我們看一下[List](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html)
接口定義:
public interface List<E> extends Collection<E>
現在,讓我們看一下它的一個多態實現的簽名,
LinkedList
:
public class LinkedList<E> implements List<E>
讓我們看一下List
的另一個實現,即ArrayList:
public class ArrayList<E> implements List<E>
值得注意的是,這兩個類的名稱中都包含單詞List
。此外,根據內部實現,它們的專業名稱是Array
和Linked
。因此名稱ArrayList
和LinkedList.
[Connection](https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/Connection.html)
接口用於定義數據庫連接類型,是遵循該約定的 Java 庫中的另一個示例。
3. 執行 Java 命名約定
為了說明該約定的用法,我們將使用能夠被識別的多態User
類型。因此,我們首先定義Identifiable
接口:
public interface Identifiable {
void identify();
}
現在,讓我們創建繼承自Identifiable
User
界面:
public interface User extends Identifiable {
void authorize();
}
User
分為兩個實現, RegularUser
和RootUser
。
我們首先創建RegularUser
類:
public class RegularUser implements User {
@Override
public void identify() {
// some implementation
}
@Override
public void authorize() {
// some implementation
}
}
然後,讓我們定義User
的另一個實現,即RootUser
類:
public class RootUser implements User {
@Override
public void identify() {
// some implementation
}
@Override
public void authorize() {
// some implementation
}
}
值得注意的是,我們使用 Java 約定來命名我們的接口。能力接口Identifiable
被命名為形容詞。多態類型User
及其子類型RootUser
和Regular
User
被命名為名詞。
這種約定使代碼閱讀起來更加流暢。從界面名稱中可以明顯看出用戶是可識別的,並且可以是 root 用戶或普通用戶。代碼更接近純英文,提高了可讀性。
4. 錯誤接口命名示例
企業 Java 應用程序中另一個廣泛使用的模式來自匈牙利表示法。在本節中,我們將簡要討論前面的I
和Impl
後綴模式以及為什麼我們應該避免它們。
前面的I
模式表明任何接口名稱都以大寫字母I
開頭,I 是 Interface 的縮寫。這在 C# 代碼中更為常見,我們沒有關鍵字來區分接口實現和繼承。然而,這在 Java 中不是必需的,因為我們可以通過查看關鍵字implements
和extends
來區分實現和繼承。
Impl
後綴模式建議命名接口的實現而不是接口本身。因此,所有實現名稱都以Impl
結尾。當我們創建一個具有單一實現的接口並且找不到真正代表其專業化的名稱時,通常會出現這種情況。然而, Impl
這個詞並沒有添加任何東西,因為類簽名表明它正在實現某些東西。
因此,我們必須避免使用I
或Impl
模式命名接口和類,例如UserImpl
、 IUser
、 IIdentifiable
和IdentifiableImpl.
5. 結論
在本教程中,我們研究了接口的不同命名約定。
Java 約定將接口名稱翻譯為更接近簡單英語的名稱。這有助於提高代碼的可讀性和可維護性。
命名約定取決於品味和公司標準。然而,Java 應用程序更符合 Java 內部庫約定。
與往常一樣,源代碼可以在 GitHub 上獲取。