中國化學(xué)工程第六建設(shè)公司網(wǎng)站蚌埠seo外包
文章目錄
- 編程規(guī)約
- 命名風(fēng)格
- 常量定義
- 代碼格式
- OOP規(guī)約
- 集合處理
- 并發(fā)處理
- 控制語句
- 注釋規(guī)約
- 其它
編程規(guī)約
命名風(fēng)格
1.代碼中的命名均不能以下劃線或者美元符號開始,也不能以下劃線或者美元符號結(jié)束
例如:_name | name__ | name$ | $name
2.代碼中的命名嚴(yán)禁使用拼音與英文混合的方式,更不允許直接使用中文的方式
說明:正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。注意,即使純拼音命名方式也要避免采用。
正例:alibaba | taobao 等國際通用的名稱,可以視為英文直接命名
反:DaZhepromotion
3. 類名使用 UpperCamelCase 風(fēng)格,必須遵從駝峰形式,但以下情形例外:DO / BO /
DTO / VO / AO
例如:UserDao
4. 方法名、參數(shù)名、成員變量、局部變量都統(tǒng)一使用 lowerCamelCase 風(fēng)格,必須遵從
駝峰形式
例如:localValue
5. 常量命名全部大寫,單詞間用下劃線隔開,力求語義表達(dá)完整清楚,不要嫌名字長。
例如:MAX_STOCK_COUNT
6. 抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結(jié)尾;測試類命名以它要測試的類的名稱開始,以 Test 結(jié)尾。
7. 中括號是數(shù)組類型的一部分,數(shù)組定義如下:String[] args;
反例:使用String args[ ]的方式來定義
8.POJO 類中布爾類型的變量,都不要加 is,否則部分框架解析會引起序列化錯誤。
反例:定義為基本數(shù)據(jù)類型 Boolean isDeleted;的屬性,它的方法也是 isDeleted(),RPC框架在反向解析的時候,“以為”對應(yīng)的屬性名稱是 deleted,導(dǎo)致屬性獲取不到,進(jìn)而拋出異常。
9.包名統(tǒng)一使用小寫,點(diǎn)分隔符之間有且僅有一個自然語義的英語單詞。
包名統(tǒng)一使用單數(shù)形式,但是類名如果有復(fù)數(shù)含義,類名可以使用復(fù)數(shù)形式。
正例: 應(yīng)用工具類包名為 com.alibaba.open.util
、類名為 MessageUtils
(此規(guī)則參考spring 的框架結(jié)構(gòu))
10. 杜絕完全不規(guī)范的縮寫,避免望文不知義。
反例:AbstractClass“縮寫”命名成 AbsClass;condition“縮寫”命名成 condi,此類隨意縮寫嚴(yán)重降低了代碼的可閱讀性。
11. 為了達(dá)到代碼自解釋的目標(biāo),任何自定義編程元素在命名時,使用盡量完整的單詞組合來表達(dá)其意。
正例:從遠(yuǎn)程倉庫拉取代碼的類命名為 PullCodeFromRemoteRepository
反例:變量 int a
; 的隨意命名方式。
12. 如果模塊、接口、類、方法使用了設(shè)計模式,在命名時體現(xiàn)出具體模式。
說明:將設(shè)計模式體現(xiàn)在名字中,有利于閱讀者快速理解架構(gòu)設(shè)計理念。
public class OrderFactory;
public class LoginProxy;
public class ResourceObserver;
13. 各層命名規(guī)約
A) Service/DAO 層方法命名規(guī)約
1) 獲取單個對象的方法用 get 做前綴。
2) 獲取多個對象的方法用 list 做前綴。
3) 獲取統(tǒng)計值的方法用 count 做前綴。
4) 插入的方法用 save/insert 做前綴。
5) 刪除的方法用 remove/delete 做前綴。
6) 修改的方法用 update 做前綴。
B) 領(lǐng)域模型命名規(guī)約
1) 數(shù)據(jù)對象:xxxDO,xxx 即為數(shù)據(jù)表名。
2) 數(shù)據(jù)傳輸對象:xxxDTO,xxx 為業(yè)務(wù)領(lǐng)域相關(guān)的名稱。
3) 展示對象:xxxVO,xxx 一般為網(wǎng)頁名稱。
4) POJO 是 DO/DTO/BO/VO 的統(tǒng)稱,禁止命名成 xxxPOJO。
常量定義
1. 不允許任何魔法值(即未經(jīng)定義的常量)直接出現(xiàn)在代碼中
//反例:
String key = "Id#taobao_" + tradeId;
cache.put(key, value);
2. long 或者 Long 初始賦值時,使用大寫的 L,不能是小寫的 l,小寫容易跟數(shù)字 1 混淆,造成誤解。
說明:Long a = 2l; 寫的是數(shù)字的 21,還是 Long 型的 2?
3. 不要使用一個常量類維護(hù)所有常量,按常量功能進(jìn)行歸類,分開維護(hù)。
4. 常量的復(fù)用層次有五層:跨應(yīng)用共享常量、應(yīng)用內(nèi)共享常量、子工程內(nèi)共享常量、包內(nèi)共享常量、類內(nèi)共享常量。
5. 如果變量值僅在一個范圍內(nèi)變化,且?guī)в忻Q之外的延伸屬性,定義為枚舉類。
代碼格式
1. 大括號的使用約定。如果是大括號內(nèi)為空,則簡潔地寫成{}即可,不需要換行;如果
是非空代碼塊則:
1) 左大括號前不換行。
2) 左大括號后換行。
3) 右大括號前換行。
4) 右大括號后還有 else 等代碼則不換行;表示終止的右大括號后必須換行。
2. 左小括號和字符之間不出現(xiàn)空格;同樣,右小括號和字符之間也不出現(xiàn)空格。詳見
第 5 條下方正例提示。
反例:if (空格 a == b 空格)
3. if/for/while/switch/do 等保留字與括號之間都必須加空格。
4. 任何二目、三目運(yùn)算符的左右兩邊都需要加一個空格。
說明:運(yùn)算符包括賦值運(yùn)算符=、邏輯運(yùn)算符&&、加減乘除符號等。
5. 采用 4 個空格縮進(jìn),禁止使用 tab 字符。
說明:如果使用 tab 縮進(jìn),必須設(shè)置 1 個 tab 為 4 個空格。IDEA 設(shè)置 tab 為 4 個空格時, 請勿勾選 Use tab character;而在 eclipse 中,必須勾選 insert spaces for tabs。
例:
public static void main(String[] args) { // 縮進(jìn) 4 個空格 String say = "hello"; // 運(yùn)算符的左右必須有一個空格 int flag = 0; // 關(guān)鍵詞 if 與括號之間必須有一個空格,括號內(nèi)的 f 與左括號,0 與右括號不需要空格 if (flag == 0) { System.out.println(say); } // 左大括號前加空格且不換行;左大括號后換行 if (flag == 1) { System.out.println("world"); // 右大括號前換行,右大括號后有 else,不用換行 } else { System.out.println("ok"); // 在右大括號后直接結(jié)束,則必須換行 }
}
6. 注釋的雙斜線與注釋內(nèi)容之間有且僅有一個空格。
// 注釋內(nèi)容,注意在//和注釋內(nèi)容之間有一個空格。
7. 單行字符數(shù)限制不超過 120 個,超出需要換行,換行時遵循如下原則:
- 第二行相對第一行縮進(jìn) 4 個空格,從第三行開始,不再繼續(xù)縮進(jìn),參考示例。
- 運(yùn)算符與下文一起換行。
- 方法調(diào)用的點(diǎn)符號與下文一起換行。
- 方法調(diào)用時,多個參數(shù),需要換行時,在逗號后進(jìn)行。
- 在括號前不要換行,見反例。
// 正例:
StringBuffer sb = new StringBuffer();
// 超過 120 個字符的情況下,換行縮進(jìn) 4 個空格,點(diǎn)號和方法名稱一起換行
sb.append("zi").append("xin")... .append("huang")... .append("huang")... .append("huang");
// 反例:
StringBuffer sb = new StringBuffer();
// 超過 120 個字符的情況下,不要在括號前換行
sb.append("zi").append("xin")...append ("huang");
// 參數(shù)很多的方法調(diào)用可能超過 120 個字符,不要在逗號前換行
method(args1, args2, args3, ... , argsX);
8. 方法參數(shù)在定義和傳入時,多個參數(shù)逗號后邊必須加空格。
例:下例中實(shí)參的"a",后邊必須要有一個空格。method("a", "b", "c");
9. IDE 的 text file encoding 設(shè)置為 UTF-8; IDE 中文件的換行符使用 Unix 格式,
不要使用 Windows 格式
OOP規(guī)約
1. 避免通過一個類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法,無謂增加編譯器解析成本,直接用類名來訪問即可。
2. 所有的覆寫方法,必須加@Override 注解。
說明:getObject()與 get0bject()的問題。一個是字母的 O,一個是數(shù)字的 0,加@Override 可以準(zhǔn)確判斷是否覆蓋成功。另外,如果在抽象類中對方法簽名進(jìn)行修改,其實(shí)現(xiàn)類會馬上編 譯報錯。
3. 相同參數(shù)類型,相同業(yè)務(wù)含義,才可以使用 Java 的可變參數(shù),避免使用 Object。
說明:可變參數(shù)必須放置在參數(shù)列表的最后。(提倡同學(xué)們盡量不用可變參數(shù)編程)
正例:public User getUsers(String type, Integer... ids) {...}
4. 外部正在調(diào)用或者二方庫依賴的接口,不允許修改方法簽名,避免對接口調(diào)用方產(chǎn)生影響。接口過時必須加@Deprecated 注解,并清晰地說明采用的新接口或者新服務(wù)是什么。
5. 不能使用過時的類或方法。
說明:
java.net.URLDecoder
中的方法decode(String encodeStr)
這個方法已經(jīng)過時,應(yīng)該使用雙參數(shù)decode(String source, String encode)
。接口提供方既然明確是過時接口,那么有義務(wù)同時提供新的接口;作為調(diào)用方來說,有義務(wù)去考證過時方法的新實(shí)現(xiàn)是什么。
6. Object 的 equals 方法容易拋空指針異常,應(yīng)使用常量或確定有值的對象來調(diào)用equals。
正例:"test".equals(object);
反例:object.equals("test");
說明:推薦使用 java.util.Objects#equals(JDK7 引入的工具類)
7. 所有的相同類型的包裝類對象之間值的比較,全部使用 equals 方法比較。
說明:對于 Integer var = ? 在-128 至 127 范圍內(nèi)的賦值,Integer對象是在IntegerCache.cache 產(chǎn)生,會復(fù)用已有對象,這個區(qū)間內(nèi)的 Integer 值可以直接使用==進(jìn)行判斷,但是這個區(qū)間之外的所有數(shù)據(jù),都會在堆上產(chǎn)生,并不會復(fù)用已有對象,這是一個大坑, 推薦使用 equals 方法進(jìn)行判斷。
8. 關(guān)于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標(biāo)準(zhǔn)如下:
- 所有的 POJO 類屬性必須使用包裝數(shù)據(jù)類型。
- RPC 方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型。
- 所有的局部變量使用基本數(shù)據(jù)類型。
說明:POJO 類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進(jìn)行賦值,任何 NPE 問題,或者入庫檢查,都由使用者來保證。
9. 定義 DO/DTO/VO 等 POJO 類時,不要設(shè)定任何屬性默認(rèn)值。
反例:POJO 類的 gmtCreate 默認(rèn)值為 new Date();但是這個屬性在數(shù)據(jù)提取時并沒有置入具體值,在更新其它字段時又附帶更新了此字段,導(dǎo)致創(chuàng)建時間被修改成當(dāng)前時間。
10. 序列化類新增屬性時,請不要修改 serialVersionUID 字段,避免反序列失敗
如果完全不兼容升級,避免反序列化混亂,那么請修改 serialVersionUID 值。
說明:注意 serialVersionUID 不一致會拋出序列化運(yùn)行時異常。
11.構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯,如果有初始化邏輯,請放在 init 方法中。
12.POJO 類必須寫 toString 方法。使用 IDE 的中工具:source> generate toString
時,如果繼承了另一個 POJO 類,注意在前面加一下 super.toString
。
說明:在方法執(zhí)行拋出異常時,可以直接調(diào)用 POJO 的 toString()方法打印其屬性值,便于排
查問題。
13. 使用索引訪問用 String 的 split 方法得到的數(shù)組時,需做最后一個分隔符后有無內(nèi)容的檢查,否則會有拋 IndexOutOfBoundsException 的風(fēng)險。
14. 類內(nèi)方法定義順序依次是:公有方法或保護(hù)方法 > 私有方法 > getter/setter方法。
15.final 可以聲明類、成員變量、方法、以及本地變量
下列情況使用 final 關(guān)鍵字:
1) 不允許被繼承的類,如:String 類。
2) 不允許修改引用的域?qū)ο?#xff0c;如:POJO 類的域變量。
3) 不允許被重寫的方法,如:POJO 類的 setter 方法。
4) 不允許運(yùn)行過程中重新賦值的局部變量。
5) 避免上下文重復(fù)使用一個變量,使用 final 描述可以強(qiáng)制重新定義一個變量,方便更好 地進(jìn)行重構(gòu)。
集合處理
1. 關(guān)于 hashCode 和 equals 的處理,遵循如下規(guī)則:
1) 只要重寫 equals,就必須重寫 hashCode。
2) 因?yàn)?Set 存儲的是不重復(fù)的對象,依據(jù) hashCode 和 equals 進(jìn)行判斷,所以 Set 存儲的
對象必須重寫這兩個方法。
3) 如果自定義對象做為 Map 的鍵,那么必須重寫 hashCode 和 equals。
說明:String 重寫了 hashCode 和 equals 方法,所以我們可以非常愉快地使用 String 對象 作為 key 來使用。
- ArrayList的subList結(jié)果不可強(qiáng)轉(zhuǎn)成ArrayList,否則會拋出ClassCastException 異常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList.
說明:subList 返回的是 ArrayList 的內(nèi)部類 SubList,并不是 ArrayList ,而是 ArrayList的一個視圖,對于 SubList 子列表的所有操作最終會反映到原列表上。
3. 在 subList 場景中,高度注意對原集合元素個數(shù)的修改,會導(dǎo)致子列表的遍歷、增加、
刪除均會產(chǎn)生 ConcurrentModificationException 異常。
4. 使用集合轉(zhuǎn)數(shù)組的方法,必須使用集合的 toArray(T[] array),傳入的是類型完全一樣的數(shù)組,大小就是 list.size()。
說明:使用 toArray 帶參方法,入?yún)⒎峙涞臄?shù)組空間不夠大時,toArray 方法內(nèi)部將重新分配 內(nèi)存空間,并返回新數(shù)組地址;如果數(shù)組元素大于實(shí)際所需,下標(biāo)為[ list.size() ]的數(shù)組 元素將被置為null,其它數(shù)組元素保持原值,因此最好將方法入?yún)?shù)組大小定義與集合元素個數(shù)一致。
例:
List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
反例:直接使用 toArray 無參方法存在問題,此方法返回值只能是 Object[]類,若強(qiáng)轉(zhuǎn)其它
類型數(shù)組將出現(xiàn) ClassCastException 錯誤。
5. 使用工具類 Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時,不能使用其修改集合相關(guān)的方法,它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。
說明:asList 的返回對象是一個 Arrays 內(nèi)部類,并沒有實(shí)現(xiàn)集合的修改方法。
Arrays.asList體現(xiàn)的是適配器模式,只是轉(zhuǎn)換接口,后臺的數(shù)據(jù)仍是數(shù)組。
String[] str = new String[] { "you", "wu" };
List list = Arrays.asList(str);
第一種情況:list.add(“yangguanbao”);
運(yùn)行時異常。 第二種情況:str[0] = “gujin”; 那么 list.get(0)也會隨之修改。
6. 泛型通配符<? extends T>來接收返回的數(shù)據(jù),此寫法的泛型集合不能使用 add 方法,而<? super T>不能使用 get 方法,做為接口調(diào)用賦值時易出錯。
7. 不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作。remove 元素請使用 Iterator
方式,如果并發(fā)操作,需要對 Iterator 對象加鎖。
// 正例:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) { String item = iterator.next(); if (刪除元素的條件) { iterator.remove(); }
}
// 反例:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String item : list) { if ("1".equals(item)) { list.remove(item); }
}
8. 在 JDK7 版本及以上,Comparator 要滿足如下三個條件,不然 Arrays.sort,
Collections.sort 會報 IllegalArgumentException 異常。
說明:三個條件如下
1) x,y 的比較結(jié)果和 y,x 的比較結(jié)果相反。
2) x>y,y>z,則 x>z。
3) x=y,則 x,z 比較結(jié)果和 y,z 比較結(jié)果相同。
并發(fā)處理
1. 獲取單例對象需要保證線程安全,其中的方法也要保證線程安全。
說明:資源驅(qū)動類、工具類、單例工廠類都需要注意。
2. 創(chuàng)建線程或線程池時請指定有意義的線程名稱,方便出錯時回溯。
例:
public class TimerTaskThread extends Thread { public TimerTaskThread() { super.setName("TimerTaskThread");...}
}
3. 線程資源必須通過線程池提供,不允許在應(yīng)用中自行顯式創(chuàng)建線程。
說明:使用線程池的好處是減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷,解決資 源不足的問題。如果不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導(dǎo)致消耗完內(nèi)存或者 “過度切換”的問題。
4.線程池不允許使用 Executors 去創(chuàng)建,而是通過 ThreadPoolExecutor 的方式,這樣
的處理方式讓寫的同學(xué)更加明確線程池的運(yùn)行規(guī)則,規(guī)避資源耗盡的風(fēng)險。
說明:Executors 返回的線程池對象的弊端如下:
1)FixedThreadPool 和 SingleThreadPool: 允許的請求隊(duì)列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導(dǎo)致 OOM。
2)CachedThreadPool 和ScheduledThreadPool: 允許的創(chuàng)建線程數(shù)量為 Integer.MAX_VALUE,可能會創(chuàng)建大量的線程,從而導(dǎo)致 OOM。
- SimpleDateFormat 是線程不安全的類,一般不要定義為 static 變量,如果定義為static,必須加鎖,或者使用 DateUtils 工具類。
正例:注意線程安全,使用 DateUtils。
private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd"); }
};
說明:如果是 JDK8 的應(yīng)用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar,
DateTimeFormatter 代替 SimpleDateFormat,官方給出的解釋:simple beautiful strong
immutable thread-safe。
6.高并發(fā)時,同步調(diào)用應(yīng)該去考量鎖的性能損耗。能用無鎖數(shù)據(jù)結(jié)構(gòu),就不要用鎖;能鎖區(qū)塊,就不要鎖整個方法體;能用對象鎖,就不要用類鎖。
說明:盡可能使加鎖的代碼塊工作量盡可能的小,避免在鎖代碼塊中調(diào)用 RPC 方法。
- 對多個資源、數(shù)據(jù)庫表、對象同時加鎖時,需要保持一致的加鎖順序,否則可能會造成死鎖。
說明:線程一需要對表 A、B、C 依次全部加鎖后才可以進(jìn)行更新操作,那么線程二的加鎖順序 也必須是 A、B、C,否則可能出現(xiàn)死鎖。
8.并發(fā)修改同一記錄時,避免更新丟失,需要加鎖。要么在應(yīng)用層加鎖,要么在緩存加鎖,要么在數(shù)據(jù)庫層使用樂觀鎖,使用 version 作為更新依據(jù)。
說明:如果每次訪問沖突概率小于 20%,推薦使用樂觀鎖,否則使用悲觀鎖。樂觀鎖的重試次 數(shù)不得小于 3 次。
9.多線程并行處理定時任務(wù)時,Timer 運(yùn)行多個 TimeTask 時,只要其中之一沒有捕獲拋出的異常,其它任務(wù)便會自動終止運(yùn)行,使用 ScheduledExecutorService
則沒有這個問題。
10.使用 CountDownLatch
進(jìn)行異步轉(zhuǎn)同步操作,每個線程退出前必須調(diào)用 countDown
方法,線程執(zhí)行代碼注意 catch 異常,確保 countDown 方法被執(zhí)行到,避免主線程無法執(zhí)行至 await 方法,直到超時才返回結(jié)果。
說明:注意,子線程拋出異常堆棧,不能在主線程 try-catch 到。
控制語句
1.在一個 switch 塊內(nèi),每個 case 要么通過 break/return 等來終止,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個 case 為止;在一個 switch 塊內(nèi),都必須包含一個 default 語句并且放在最后,即使它什么代碼也沒有。
2. 在 if/else/for/while/do 語句中必須使用大括號。即使只有一行代碼,避免采用單行的編碼方式:if (condition) statements;
3. 表達(dá)異常的分支時,少用 if-else 方式,這種方式可以改寫成:
if (condition) { ... return obj;
}
// 接著寫 else 的業(yè)務(wù)邏輯代碼;
說明:如果非得使用 if()…else if()…else…方式表達(dá)邏輯,【強(qiáng)制】避免后續(xù)代碼維
護(hù)困難,請勿超過 3 層。
正例:超過 3 層的 if-else 的邏輯判斷代碼可以使用衛(wèi)語句、策略模式、狀態(tài)模式等來實(shí)現(xiàn),
其中衛(wèi)語句示例如下:
public void today() {if (isBusy()) {System.out.println(“change time.”);return;}if (isFree()) {System.out.println(“go to travel.”);return;}System.out.println(“stay at home to learn Alibaba Java Coding Guidelines.”);return;
}
注釋規(guī)約
1.類、類屬性、類方法的注釋必須使用 Javadoc 規(guī)范,使用/*內(nèi)容/格式,不得使用// xxx 方式。
說明:在 IDE 編輯窗口中,Javadoc 方式會提示相關(guān)注釋,生成 Javadoc 可以正確輸出相應(yīng)注 釋;在 IDE 中,工程調(diào)用方法時,不進(jìn)入方法即可懸浮提示方法、參數(shù)、返回值的意義,提高 閱讀效率。
2.所有的抽象方法(包括接口中的方法)必須要用 Javadoc 注釋、除了返回值、參數(shù)、異常說明外,還必須指出該方法做什么事情,實(shí)現(xiàn)什么功能。
說明:對子類的實(shí)現(xiàn)要求,或者調(diào)用注意事項(xiàng),請一并說明。
3.所有的類都必須添加創(chuàng)建者和創(chuàng)建日期。
4. 方法內(nèi)部單行注釋,在被注釋語句上方另起一行,使用//注釋。方法內(nèi)部多行注釋使用/* */注釋,注意與代碼對齊。
5.所有的枚舉類型字段必須要有注釋,說明每個數(shù)據(jù)項(xiàng)的用途。
6.與其“半吊子”英文來注釋,不如用中文注釋把問題說清楚。專有名詞與關(guān)鍵字保持
英文原文即可。
反例:“TCP 連接超時”解釋成“傳輸控制協(xié)議連接超時”,理解反而費(fèi)腦筋。
其它
1.在使用正則表達(dá)式時,利用好其預(yù)編譯功能,可以有效加快正則匹配速度。
說明:不要在方法體內(nèi)定義:
Pattern pattern = Pattern.compile(規(guī)則);
2.velocity 調(diào)用 POJO 類的屬性時,建議直接使用屬性名取值即可,模板引擎會自動按規(guī)范調(diào)用 POJO 的 getXxx(),如果是 boolean 基本數(shù)據(jù)類型變量(boolean 命名不需要加 is前綴),會自動調(diào)用 isXxx()方法。
說明:注意如果是 Boolean 包裝類對象,優(yōu)先調(diào)用 getXxx()的方法。
3.后臺輸送給頁面的變量必須加$!{var}
——中間的感嘆號。
說明:如果 var=null 或者不存在,那么${var}會直接顯示在頁面上。
4.注意 Math.random() 這個方法返回是 double 類型,注意取值的范圍 0≤x<1(能夠取到零值,注意除零異常),如果想獲取整數(shù)類型的隨機(jī)數(shù),不要將 x 放大 10 的若干倍然后取整,直接使用Random 對象的 nextInt 或者 nextLong 方法。
5.獲取當(dāng)前毫秒數(shù) System.currentTimeMillis()
; 而不是 new Date().getTime();
說明:如果想獲取更加精確的納秒級時間值,使用
System.nanoTime()
的方式。在 JDK8 中, 針對統(tǒng)計時間等場景,推薦使用 Instant 類。