題記
前段時間的一次面試,面試官問我最近有讀什么書,我答了云云苦银,又問有什么收獲或者令你印象深刻的地方红碑,無話可說。似乎讀過的書只記得書名绰上,沒有任何感悟體會旨怠,也無從證明。故寫一些小記蜈块。
編程規(guī)約
序列化類新增屬性并兼容升級時鉴腻,serialVersionUID不要修改。serialVersionUID的作用是反序列化時百揭,會判斷當(dāng)前類和反序列化對象的版本是否一致爽哎,一致才能反序列化。但是我們要兼容新增屬性器一,則不用修改serialVersionUID课锌,新增的屬性會在反序列化中賦初值。
POJO對象都要寫toString()方法祈秕,便于排查問題渺贤。
ArrayList的subList和ArrayList并不是一個類,因此不能夠強(qiáng)轉(zhuǎn)请毛。
集合轉(zhuǎn)數(shù)組方法toArray(T[] array)要帶參的癣亚,若不帶參只能返回Object[],強(qiáng)轉(zhuǎn)會導(dǎo)致失敗获印,而且T[] array這個數(shù)組的大小要和集合的大小保持一致述雾,不一致也不會錯街州,但非常不推薦。
數(shù)組轉(zhuǎn)集合的方法Arrays.asList()返回的集合也是Arrays的一個內(nèi)部類玻孟,并不能支持修改等操作唆缴,它是一種適配器模式,只改變了接口黍翎,底層仍是數(shù)組面徽。如修改了array[0],那么list.get(0)也會跟著變化匣掸。
PECS (Producer Extends Consumer Super)
頻繁讀忍宋伞(支持get,不支持add) 固定上邊界 <? extends T>
頻繁插入(支持add碰酝,不支持get) 固定下邊界 <? extends T>線程池創(chuàng)建不能使用Executor霎匈,要用ThreadPoolExecutor,這樣線程池運(yùn)行規(guī)則更明確送爸,也可以減少OOM的發(fā)生(因?yàn)镋xecutor返回的線程池里铛嘱,F(xiàn)ixedThreadPool和SingleThreadPool的請求隊(duì)列長度是Integer.MAX_VALUE,CachedThreadPool和ScheduledThreadPool的線程最大數(shù)也是Integer.MAX_VALUE袭厂,都容易造成內(nèi)存溢出墨吓。)
SimpleDateFormat是將時間格式化的類,但是它是線程不安全的纹磺,在并發(fā)情況下帖烘,需要加鎖或者結(jié)合ThreadLocal來使用。
switch的default是在沒有匹配成功時執(zhí)行橄杨,必須要有break蚓让,否則會往下執(zhí)行直到遇到break。而且每個switch都必須有一個default讥珍,哪怕default是空历极。
異常日志
不能在finally里使用return,這樣try里的return就無效了衷佃。
日志文件要保存15天以上趟卸,便于排查以周為單位的問題。
日志級別要清晰氏义,生產(chǎn)環(huán)境禁止輸出debug日志锄列,有選擇的輸出info日志,warn日志記錄潛在的問題惯悠,error日志只記錄系統(tǒng)邏輯錯誤邻邮,異常等錯誤信息。
單元測試
好的單元測試要像AIR一樣無聲無息但必不可少克婶。遵循三個原則Automatic,Independent,Repeatable筒严。
單元測試基本目標(biāo):語句覆蓋率70%丹泉,核心模塊語句覆蓋率和分支覆蓋率100%。
安全規(guī)約
- 用戶敏感數(shù)據(jù)禁止直接展示鸭蛙,必須進(jìn)行脫敏摹恨,比如手機(jī)號176****1667。
MySQL數(shù)據(jù)庫
表達(dá)是與否概念的字段命名為is_XXX娶视,類型為unsigned tinyint晒哄,1表示是,0表示否肪获。
數(shù)據(jù)庫中的表名寝凌,字段名都要全部小寫。表名不為復(fù)數(shù)孝赫,只表示表內(nèi)實(shí)體內(nèi)容较木,不表示表內(nèi)實(shí)體的數(shù)量。
小數(shù)保存的類型為decimal寒锚,不能用float和double,他倆存在精度損失的問題违孝,在比較大小的時候可能返回錯誤的結(jié)果刹前。
不使用外鍵和級聯(lián)更新,這種邏輯應(yīng)該在應(yīng)用層處理雌桑。比如A表中的id是主鍵喇喉,關(guān)聯(lián)B表中的外鍵id,若更新A.id則會同時更新B.id校坑,這就是級聯(lián)更新拣技。外鍵和級聯(lián)更新適合單機(jī)低兵法,不適合高并發(fā)耍目,外鍵還影響插入速度膏斤,因此盡量不使用。
POJO的類屬性不能加is邪驮,數(shù)據(jù)庫的必須加莫辨。
SUM()方法在數(shù)據(jù)為空時也返回NULL,可能會出現(xiàn)NPE問題毅访,可以用這種SQL語句處理:
SELECT IF(ISNULL(SUM(score.score)),0,SUM(score.score)) FROM score;
工程結(jié)構(gòu)
- 高并發(fā)服務(wù)器建議調(diào)小time_wait超時時間沮榜,默認(rèn)是240s,高并發(fā)情況下可能會有過多的time_wait狀態(tài)的線程喻粹。同時調(diào)大fd蟆融,Linux系統(tǒng)的fd數(shù)是1024,每個連接也會占用一個fd守呜,因此要調(diào)高該值型酥。