阿里Java 開發(fā)手冊 筆記

編程規(guī)約


命名規(guī)范

變量命名不使用拼音镜撩。

領(lǐng)域模型相關(guān)命名使用全大寫。
UserDo,UserDTO

常量名使用全大寫宜鸯,下劃線分開遮怜,盡量表達清除。
MAX_STOCK_COUNT

抽象類以Abstract或者Base開頭即碗。
BaseDAO

異常類名以Exception結(jié)尾陌凳。

測試類以它要測試的類的名稱開始,Test結(jié)尾初橘。
UserServiceTest

POJO中充岛,布爾類型變量名不要加is,某些框架會引起序列化錯誤夜只。

包名統(tǒng)一小寫蒜魄、單數(shù),類名如Utils可以復(fù)數(shù)。

接口方法不加修飾符號峦阁。

將設(shè)計模式體現(xiàn)在類名中
OrderFactory,LoginProxy,ResourceObserver

接口和實現(xiàn)類的命名規(guī)則:

  1. 對于Service和DAO耘成,暴露接口驹闰,內(nèi)部實現(xiàn)類使用Impl后綴撒会。
  2. 對于形容能力的接口,取對應(yīng)名詞作為實現(xiàn)類屹培。 AbstractTranslator實現(xiàn)Translatable

枚舉類帶上Enum后綴怔檩,成員名稱大寫薛训。

Service/DAO層方法命名規(guī)約。

  1. 獲取單個對象的方法用get做前綴闸英。
  2. 獲取多個對象的方法法用list做前綴介袜。
  3. 獲取統(tǒng)計值方法用count做前綴。
  4. 插入的方法用save或insert做前綴沛豌。
  5. 刪除的方法用remove或delete做前綴赃额。
  6. 修改的方法用update做前綴。

領(lǐng)域模型命名規(guī)約

  1. 數(shù)據(jù)對象:xxxDO芍锦,xxx為表名飞盆。
  2. 數(shù)據(jù)傳輸對象:xxxDTO,xxx為業(yè)務(wù)領(lǐng)域相關(guān)名稱孽水。
  3. 展示對象:xxxVO城看,xxx一般為網(wǎng)頁名稱。
  4. POJP是DO/DTO/BO/VO的統(tǒng)稱

常量定義

  1. 不允許出現(xiàn)魔法值(即未經(jīng)定義的常量)直接出現(xiàn)在代碼中炼鞠。
  2. 常量應(yīng)用分層
  1. 跨應(yīng)用共享常量:放置在二方庫中。
  2. 應(yīng)用內(nèi)共享常量:放置在一方庫的modules的constant目錄下朝扼。
  3. 子工程內(nèi)部共享常量:在當(dāng)前子工程的constant目錄下霎肯。
  4. 包內(nèi)共享常量:放在包內(nèi)單獨的constant目錄下。
  5. 類內(nèi)共享常量:類內(nèi)部private static final肠仪。
    3.如果變量值僅在一個范圍內(nèi)變化用Enum類备典。如果帶有名稱之外的延伸屬性提佣,必須使用Enum類
//正例:
public DayEnum{MONDAY(1),TUESDAY(2),WEDNESDAY(3),THURSDAY(4),FRIDAY(5),SATURDAY(6),SUNDAY(7);}

格式規(guī)約

  1. 大括號使用約定:
//正例
public static void main(String[] args) {
    // 縮進 4 個空格
    String say = "hello";
    // 運算符的左右必須有一個空格
    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é)束舱权,則必須換行
    }
}
  1. 單行字符不超過120個宴倍,換行規(guī)則如下:
  1. 第二行縮進4個空格,第三行不再繼續(xù)縮進鸵贬。
  2. 運算符阔逼、方法調(diào)用符與下文一起換行。
  3. 逗號后換行涯保。
//正例
dataset.add("a", "b", "c")...
    .add("a", "b", "c")...
    "d");
  1. 逗號后必須要有一個空格周伦。
  2. IDE的text file encoding設(shè)置為UTF-8,換行符用Unix格式及志。
  3. 方法體內(nèi)不同的業(yè)務(wù)邏輯語句組之間插入一個空格寨腔。

OOP規(guī)約

  1. 避免使用對象來訪問靜態(tài)變量或方法,直接用類名迫卢。
    BeanUtils.copyProperties(model)
  2. 覆蓋方法必須加@Override注解。
  3. 接口被調(diào)用時乾蛤,不能改動家卖,過時加@Deprecated注解。
  4. 不能使用過時的類或方法趴樱。
  5. 使用常量或確定有值的對象來調(diào)用equals酪捡,或使用Objects.equals(a,b)方法。
  6. 所有包裝類對象之間值的比較全部使用equals方法航揉。
  7. 關(guān)于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標(biāo)準(zhǔn)如下:
  1. 所有的POJO類屬性必須使用包裝數(shù)據(jù)類型金刁。
    Long id,public Integer count()
  2. RPC方法的返回值和參數(shù)使用包裝數(shù)據(jù)類型尤蛮。
  3. 所有局部變量使用基本數(shù)據(jù)類型。
  1. POJO類不要設(shè)定任何屬性默認(rèn)值醇锚。
  2. 序列化類新增屬性時,不要修改serialVersionUID焊唬。
  3. 構(gòu)造方法禁止加入任何業(yè)務(wù)邏輯赶促,初始化邏輯放在init方法中。
  4. POJO類必須寫toString方法嗦哆,注意繼承類時調(diào)用super.toString()婿滓。
  5. 類內(nèi)定義順序依次是:公有方法或保護方法 > 私有方法 > getter/setter
  6. getter/setter方法中不要增加業(yè)務(wù)邏輯。
  7. 類成員與方法訪問控制從嚴(yán):
  1. 如果不允許外部通過new來創(chuàng)建對象橘券,構(gòu)造方法必須為private秕铛。
  2. 工具類不允許有publicdefault構(gòu)造方法但两。
  3. 類非static成員變量并且與子類共享,必須是protected绽快。
  4. 類非static成員變量并且僅在本類使用紧阔,必須是private
  5. static成員變量僅在本類使用活孩,必須為private
  6. 若是static成員變量乖仇,必須考慮是否為final乃沙。
  7. 類成員方法僅供類內(nèi)部調(diào)用,必須是private训裆。
  8. 類成員方法只對繼承類公開,那么限制為protected属百。

集合處理

  1. 關(guān)于hashCodeequals的處理艺骂,遵循如下規(guī)則:
  1. 只要重寫equals,則必須重寫hashCode
  2. 如果需要用Set存儲的對象忧额,必須重寫兩個方法愧口。
  3. 如果自定義對象作為Map的鍵,必須重寫兩個方法托嚣。
  1. 集合轉(zhuǎn)數(shù)組使用集合的toArray(T[] array)厚骗,傳入類型相同领舰,大小相同的數(shù)組。
    String[] strArray = new String[list.size()];
    strArray = list.toArray(strArray);
  1. 使用工具類Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時舍咖,不能使用修改集合的方法
    說明:體現(xiàn)了適配器模式锉桑,只是轉(zhuǎn)換接口,后臺的數(shù)據(jù)仍是數(shù)組攻柠。
  2. Comparator要滿足如下三個條件杉武,不然Arrays.sortCollections.sort會報異常轻抱。
  1. x,y的比較結(jié)果和y,x的比較結(jié)果相反。
  2. x>y,y>z,則x>z较店。
  3. x=y,則x,z比較結(jié)果和y,z比較結(jié)果相同。
  1. 使用entrySet遍歷Map婚度。
  2. 高度注意Map類集合能不能存儲null值的情況官卡,如下表格:
    |集合類|Key|Value|Super|說明|
    |---|
    |Hashtable|不允許null|不允許null|Dictionary|線程安全|
    |ConcurrentHashMap|不允許null|不允許null|AbstractMap|分段鎖技術(shù)|
    |TreeMap|不允許null|允許null|AbstractMap|線程不安全|
    |HashMap|允許null|允許null|AbstractMap|線程不安全|
  3. 利用Set來去重元素寻咒。

并發(fā)處理

  1. 獲取單例對象需要保證線程安全,其中的方法也要保證饭寺。
    說明:資源驅(qū)動類叫挟、工具類、單例工廠都需要注意

  2. 創(chuàng)建線程或線程池時請指定有意義的線程名稱员凝,方便出錯時回溯绊序。

public class TimerTaskThread extends Thread {
public TimerTaskThread() {
super.setName("TimerTaskThread"); ...
}
  1. 線程資源必須通過線程池提供秽荞,不允許在應(yīng)用中自行顯式創(chuàng)建線程。
    說明:使用線程池的好處是減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷阶捆,解決資源不足的問題钦听。如果不使用線程池朴上,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導(dǎo)致消耗完內(nèi)存或者“過度切換”的問題。

  2. 線程池不允許使用Executors去創(chuàng)建叼架,而是通過ThreadPoolExecutor的方式,以更明確線程池運行規(guī)則扮饶。

  3. SimpleDateFormat是線程不安全的類乍构,不要定義為static,或使用DateUtils工具類

private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>(){
    @Override
    protected DateFormat initialValue(){
        return new SimpleDateFormat("yyyy-MM-dd");
    }
}
  1. 高并發(fā)時岂丘,同步調(diào)用應(yīng)該去考量鎖的性能損耗元潘。無鎖數(shù)據(jù)結(jié)構(gòu)>鎖區(qū)塊>方法鎖>對象鎖>類鎖

  2. 對多個資源君仆、數(shù)據(jù)庫表牲距、對象同時加鎖時牍鞠,需要保持一致的加鎖順序,避免死鎖萤晴。

  3. 并發(fā)修改同一記錄時胁后,避免更新丟失攀芯,需要加鎖。要么在應(yīng)用加鎖殖演,要么在緩存加鎖年鸳,要么在數(shù)據(jù)庫層使用樂觀鎖,使用version作為更新依據(jù)彼棍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滥酥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缆蝉,更是在濱河造成了極大的恐慌瘦真,老刑警劉巖诸尽,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件您机,死亡現(xiàn)場離奇詭異,居然都是意外死亡咸产,警方通過查閱死者的電腦和手機仲闽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門赖欣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人社牲,你說我怎么就攤上這事云矫。” “怎么了挑社?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵痛阻,是天一觀的道長腮敌。 經(jīng)常有香客問我俏扩,道長弊添,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任嫉戚,我火速辦了婚禮澈圈,結(jié)果婚禮上瞬女,老公的妹妹穿的比我還像新娘。我一直安慰自己坤学,他們只是感情好报慕,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布卖子。 她就那樣靜靜地躺著刑峡,像睡著了一般突梦。 火紅的嫁衣襯著肌膚如雪诫舅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天宫患,我揣著相機與錄音刊懈,去河邊找鬼。 笑死娃闲,一個胖子當(dāng)著我的面吹牛虚汛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播皇帮,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼卷哩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了属拾?” 一聲冷哼從身側(cè)響起将谊,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尊浓,沒想到半個月后逞频,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡栋齿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年苗胀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褒颈。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡柒巫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谷丸,到底是詐尸還是另有隱情堡掏,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布刨疼,位于F島的核電站泉唁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏揩慕。R本人自食惡果不足惜亭畜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迎卤。 院中可真熱鬧拴鸵,春花似錦、人聲如沸蜗搔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樟凄。三九已至聘芜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缝龄,已是汗流浹背汰现。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叔壤,地道東北人瞎饲。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像炼绘,于是被迫代替她去往敵國和親企软。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 阿里巴巴 JAVA 開發(fā)手冊 1 / 32 Java 開發(fā)手冊 版本號 制定團隊 更新日期 備 注 1.0.0 阿...
    糖寶_閱讀 7,511評論 0 5
  • 目錄 一饭望、 編程規(guī)約..................................................
    owen_he閱讀 4,916評論 0 4
  • 一仗哨、編程規(guī)約 (一)命名規(guī)約 【強制】 代碼中的命名均不能以下劃線或美元符號開始形庭,也不能以下劃線或美元符號結(jié)束。反...
    喝咖啡的螞蟻閱讀 1,478評論 0 2
  • 前言: 代碼規(guī)范真的很重要厌漂∪眩看別人的代碼寫的代碼,沒有注釋苇倡,變量名很糟糕富纸,格式不規(guī)范,真的很難忍受啊旨椒。自己在實際開...
    cuteximi_1995閱讀 867評論 0 2
  • 命名風(fēng)格 【強制】代碼中的命名均不能以下劃線或美元符號開始晓褪,也不能以下劃線或美元符號結(jié)束 【強制】代碼中的命名嚴(yán)禁...
    云A00000閱讀 3,585評論 0 0