正好洗完澡,有空就把這個坑填了。java
說道百度的編碼規範,確實能從嚴謹性鍛鍊人的思惟。python
先談一下背景吧。百度有一個代碼規範考試,須要你提交一份符合考試要求的代碼,以後會有兩審去給你提出意見。設計模式
此次我經過的java,從此次考試分以下幾點談一談:安全
一。代碼的質量:線程安全,同步問題,異常處理,設計模式一類一類的函數
如下仍是用我本身代碼來講明吧!編碼
單例模式:線程
舉個例子:設計
這個地方是要實現單例,讓整個系統中只存在一個MessageCenter,從下圖能夠看到我建立一個私用成員變量messageCenter,代碼規範
同時實現了一個私有的構造函數,保證調用MessageCenter類只能使用getInstance()去建立(惟一入口)對象
而後回到第一張圖,評審人提出來的問題是:同步問題。其實這個一開始我很困惑,我已經加了synchronized
去進行同步。(這裏能夠這樣理解,就從我目前的能力來看)句子內加了synchronized(class)表明了在這個class
裏面獲取了一個互斥鎖mutex,以後整個代碼塊{}結束了以後釋放互斥鎖。
假如學過python的話能夠這樣理解:
with threading.Lock():
something todo
回到問題,我已經構建了添加單例的代碼塊爲synchronized,那爲什麼還有同步問題?
其實查詢了一下單例模式的例子,不難發現其實我仍是少了一個null的判斷,代碼以下:
在synchronized代碼塊裏面還有一個判斷messageCenter爲空?這是爲什麼?
這個具體的描述仍是看看單例模式的那篇文章吧,雙重null判斷的含義不一樣,前者是爲了讓已存在了單例後不須要去在
建立浪費不少時間,後者則是避免在A進程執行sychronized模塊(建立MessageCenter對象的時候),又有一個進程B請求了
互斥鎖,雖然沒進去在外面等待,可是等A執行完畢釋放了互斥鎖,B以後的步奏就是作和A同樣的事情,在建立一次。結果:單例失敗!
談一下對自定義異常
首先爲何要自定義異常?
主要緣由是Java提供的異常類在仍是不能很好的闡述異常發生的緣由(雖然內置的異常類型已經夠多了)
從我下面的這個截圖來闡述吧!首先我聲明瞭一個自定義異常 MessageNotFindHandlerException
從名字就能很清楚的瞭解,消息找不處處理器(這句話其實能夠說從業務的這個緯度去表訴的,那是否是也能夠理解爲自定義異常
能夠很好的描述業務邏輯的異常,使程序可讀性更強也更有健壯性)
我這個異常繼承了一個RuntimeException(運行時異常致使運行不了)
從評審的角度來看,缺乏包裝異常,那什麼是包裝異常?
其實我弄了好久都沒弄明白,後面找評審人,評審人只打開了Exception類的實現,我就大概瞭解該去改什麼了!
很明顯咱們能看到對於Exception 起碼存在三個構造函數 Exception() Exception(String message) Exception(String message, Throwable cause)