本文為joshua317原創文章,轉載請注明:轉載自joshua317博客 https://www.joshua317.com/article/173
任何一種計算機語言都離不開標識符和關鍵字,今天我們來介紹下Java 的標識符、關鍵字和保留字。
一、標識符
在Java語言中,類、對象、方法、變量、接口和自定義數據類型等都有自己的名字,我們把這些名字統稱為標識符。
1.1 標識符的命名規則
- 標識符由數字(0~9)和字母(A~Z 和 a~z)、美元符號($)、下划線(_)
- 標識符的第一個符號為字母、下划線和美元符號,不能以數字開頭,后面可以是任何字母、數字、美元符號或下划線
- Java 嚴格區分大小寫
- 標識符中不能出現空格
- 標識符的長度可以是任意的(在java虛擬機規范中,標識符是有長度限制的)
- 關鍵字不能作為標識符
- 標識符不能和**Java中預定義的字面常量(true、false、null)**名稱相同
1.2 標識符的命名規范
阿里《Java開發手冊-泰山版》
下載地址
鏈接:https://pan.baidu.com/s/1b4cOdXWA3wF1KMRZP2ZYmg
提取碼:iigm
1. 【強制】代碼中的命名均不能以下划線或美元符號開始,也不能以下划線或美元符號結束。
反例:_name / __name / $name / name_ / name$ / name__
2. 【強制】所有編程相關的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。
說明:正確的英文拼寫和語法可以讓閱讀者易於理解,避免歧義。注意,純拼音命名方式更要避免采用。
正例:ali / alibaba / taobao / cainiao/ aliyun/ youku / hangzhou 等國際通用的名稱,可視同英文。
反例:DaZhePromotion [打折] / getPingfenByName() [評分] / int 某變量 = 3
3. 【強制】類名使用 UpperCamelCase 風格,但以下情形例外:DO / BO / DTO / VO / AO /
PO / UID 等。
正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion
反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion
4. 【強制】方法名、參數名、成員變量、局部變量都統一使用 lowerCamelCase 風格。
正例: localValue / getHttpMessage() / inputUserId
5. 【強制】常量命名全部大寫,單詞間用下划線隔開,力求語義表達完整清楚,不要嫌名字長。
正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME
反例:MAX_COUNT / EXPIRED_TIME
6. 【強制】抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結尾;測試類
命名以它要測試的類的名稱開始,以 Test 結尾。
7. 【強制】類型與中括號緊挨相連來表示數組。
正例:定義整形數組 int[] arrayDemo;
反例:在 main 參數中,使用 String args[]來定義。
8. 【強制】POJO 類中的任何布爾類型的變量,都不要加 is 前綴,否則部分框架解析會引起序列
化錯誤。
說明:在本文 MySQL 規約中的建表約定第一條,表達是與否的值采用 is_xxx 的命名方式,所以,需要在
<resultMap>設置從 is_xxx 到 xxx 的映射關系。
反例:定義為基本數據類型 Boolean isDeleted 的屬性,它的方法也是 isDeleted(),框架在反向解析的時
候,“誤以為”對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異常。
9. 【強制】包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使用
單數形式,但是類名如果有復數含義,類名可以使用復數形式。
正例:應用工具類包名為 com.alibaba.ei.kunlun.aap.util、類名為 MessageUtils(此規則參考 spring 的
框架結構
10.【強制】避免在子父類的成員變量之間、或者不同代碼塊的局部變量之間采用完全相同的命名,
使可讀性降低。
說明:子類、父類成員變量名相同,即使是 public 類型的變量也是能夠通過編譯,而局部變量在同一方法
內的不同代碼塊中同名也是合法的,但是要避免使用。對於非 setter/getter 的參數名稱也要避免與成員變
量名稱相同。
反例:
public class ConfusingName {
public int stock;
// 非 setter/getter 的參數名稱,不允許與本類成員變量同名
public void get(String alibaba) {
if (condition) {
final int money = 666;
// ...
}
for (int i = 0; i < 10; i++) {
// 在同一方法體中,不允許與其它代碼塊中的 money 命名相同
final int money = 15978;
// ...
}
}
}
class Son extends ConfusingName {
// 不允許與父類的成員變量名稱相同
public int stock;
}
11.【強制】杜絕完全不規范的縮寫,避免望文不知義。
反例:AbstractClass“縮寫”命名成 AbsClass;condition“縮寫”命名成 condi,此類隨意縮寫嚴重降
低了代碼的可閱讀性。
12.【推薦】為了達到代碼自解釋的目標,任何自定義編程元素在命名時,使用盡量完整的單詞組
合來表達。
正例:在 JDK 中,對某個對象引用的 volatile 字段進行原子更新的類名為:AtomicReferenceFieldUpdater。
反例:常見的方法內變量為 int a;的定義方式。
13.【推薦】在常量與變量的命名時,表示類型的名詞放在詞尾,以提升辨識度。
正例:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT
反例:startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD
14.【推薦】如果模塊、接口、類、方法使用了設計模式,在命名時需體現出具體模式。
說明:將設計模式體現在名字中,有利於閱讀者快速理解架構設計理念。
正例: public class OrderFactory;
public class LoginProxy;
public class ResourceObserver;
15.【推薦】接口類中的方法和屬性不要加任何修飾符號(public 也不要加),保持代碼的簡潔
性,並加上有效的 Javadoc 注釋。盡量不要在接口里定義變量,如果一定要定義變量,確定
與接口方法相關,並且是整個應用的基礎常量。
正例:接口方法簽名 void commit();
接口基礎常量 String COMPANY = "alibaba";
反例:接口方法定義 public abstract void f();
說明:JDK8 中接口允許有默認實現,那么這個 default 方法,是對所有實現類都有價值的默認實現。
16.接口和實現類的命名有兩套規則:
1)【強制】對於 Service 和 DAO 類,基於 SOA 的理念,暴露出來的服務一定是接口,內部的實現類用
Impl 的后綴與接口區別。
正例:CacheServiceImpl 實現 CacheService 接口。
2)【推薦】如果是形容能力的接口名稱,取對應的形容詞為接口名(通常是–able 的形容詞)。
正例:AbstractTranslator 實現 Translatable 接口。
17.【參考】枚舉類名帶上 Enum 后綴,枚舉成員名稱需要全大寫,單詞間用下划線隔開。
說明:枚舉其實就是特殊的常量類,且構造方法被默認強制是私有。
正例:枚舉名字為 ProcessStatusEnum 的成員名稱:SUCCESS / UNKNOWN_REASON。
18.【參考】各層命名規約:
A) Service/DAO 層方法命名規約
1) 獲取單個對象的方法用 get 做前綴。
2) 獲取多個對象的方法用 list 做前綴,復數結尾,如:listObjects。
3) 獲取統計值的方法用 count 做前綴。
4) 插入的方法用 save/insert 做前綴。
5) 刪除的方法用 remove/delete 做前綴。
6) 修改的方法用 update 做前綴。
B) 領域模型命名規約
1) 數據對象:xxxDO,xxx 即為數據表名。
2) 數據傳輸對象:xxxDTO,xxx 為業務領域相關的名稱。
3) 展示對象:xxxVO,xxx 一般為網頁名稱。
4) POJO 是 DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO。
標識符用來命名常量、變量、類和類的對象等。因此,一個良好的編程習慣要求命名標識符時,應賦予它一個有意義或有用途的名字。
二、關鍵字
在Java語言中有些標識符是有着特殊含義的,而我們把這些有着特殊含義的標識符稱為關鍵字,有時也叫保留字。關鍵字(或者保留字)是對編譯器有特殊意義的固定單詞,一般用於表示一種數據類型,或者表示程序的結構,不能在程序中做其他目的使用。關鍵字具有專門的意義和用途,和自定義的標識符不同,不能當作一般的標識符來使用。
**特點:**關鍵字中所有字母都為小寫。
2.1 系統預留關鍵字有哪些
Java 語言目前定義了 48個關鍵字 ,2個保留字,3個預定義常量。這些關鍵字不能作為變量名、類名和方法名來使用。
48個關鍵字:abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while。 2)2個保留字(現在沒用以后可能用到作為關鍵字):goto、const。 3)3個預定義常量:true、false、null。
abstract | assert | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | continue |
default | do | double | else | enum |
extends | final | finally | float | for |
if | implements | import | int | interface |
instanceof | long | native | new | package |
private | protected | public | return | short |
static | strictfp | super | switch | synchronized |
this | throw | throws | transient | try |
void | volatile | while | goto | const |
true | false | null |
2.2 關鍵字的含義
關鍵字 | 含義 |
---|---|
abstract | 表明類或者成員方法具有抽象屬性 |
assert | 斷言,用來進行程序調試 |
boolean | 基本數據類型之一,聲明布爾類型的關鍵字 |
break | 提前跳出一個塊 |
byte | 基本數據類型之一,字節類型 |
case | 用在switch語句之中,表示其中的一個分支 |
catch | 用在異常處理中,用來捕捉異常 |
char | 基本數據類型之一,字符類型 |
class | 聲明一個類 |
const | 保留關鍵字,沒有具體含義 |
continue | 回到一個塊的開始處 |
default | 默認,例如,用在switch語句中,表明一個默認的分支。Java8 中也作用於聲明接口函數的默認實現 |
do | 用在do-while循環結構中 |
double | 基本數據類型之一,雙精度浮點數類型 |
else | 用在條件語句中,表明當條件不成立時的分支 |
enum | 枚舉 |
extends | 表明一個類型是另一個類型的子類型。對於類,可以是另一個類或者抽象類;對於接口,可以是另一個接口 |
final | 用來說明最終屬性,表明一個類不能派生出子類,或者成員方法不能被覆蓋,或者成員域的值不能被改變,用來定義常量 |
finally | 用於處理異常情況,用來聲明一個基本肯定會被執行到的語句塊 |
float | 基本數據類型之一,單精度浮點數類型 |
for | 一種循環結構的引導詞 |
goto | 保留關鍵字,沒有具體含義 |
if | 條件語句的引導詞 |
implements | 表明一個類實現了給定的接口 |
import | 表明要訪問指定的類或包 |
instanceof | 用來測試一個對象是否是指定類型的實例對象 |
int | 基本數據類型之一,整數類型 |
interface | 接口 |
long | 基本數據類型之一,長整數類型 |
native | 用來聲明一個方法是由與計算機相關的語言(如C/C++/FORTRAN語言)實現的 |
new | 用來創建新實例對象 |
package | 包 |
private | 一種訪問控制方式:私用模式 |
protected | 一種訪問控制方式:保護模式 |
public | 一種訪問控制方式:共用模式 |
return | 從成員方法中返回數據 |
short | 基本數據類型之一,短整數類型 |
static | 表明具有靜態屬性 |
strictfp | 用來聲明FP_strict(單精度或雙精度浮點數)表達式遵循[IEEE 754](https://baike.baidu.com/item/IEEE 754)算術規范 |
super | 表明當前對象的父類型的引用或者父類型的構造方法 |
switch | 分支語句結構的引導詞 |
synchronized | 表明一段代碼需要同步執行 |
this | 指向當前實例對象的引用 |
throw | 拋出一個異常 |
throws | 聲明在當前定義的成員方法中所有需要拋出的異常 |
transient | 聲明不用序列化的成員域 |
try | 嘗試一個可能拋出異常的程序塊 |
void | 聲明當前成員方法沒有返回值 |
volatile | 表明兩個或者多個變量必須同步地發生變化 |
while | 用在循環結構中 |
goto | 指定跳轉到標簽,找到標簽后,程序將處理從下一行開始的命令 |
const | 用於修改字段或局部變量的聲明。它指定字段或局部變量的值是常數,不能被修改 |
true | 布爾值真 |
false | 布爾值假 |
null | 空 |
2.3 關鍵字按用途分組
數據類型(8):byte、short、int、long、boolean、float、double、char 流程控制(10):if、else、do、while、for、switch、case、default、break、continue 修飾符(12):public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native
方法、類、接口、包、異常等(17):enum、class、interface、package、import、extends、implements、this、supper、instanceof、new、throw、throws、try、catch、finally、return 其他(6):assert、true、false、null、goto、const
本文為joshua317原創文章,轉載請注明:轉載自joshua317博客 https://www.joshua317.com/article/173