2019-07-23 看阿里守則 OOP規(guī)約* 通配符

OOP規(guī)約

1.避免使用類對(duì)象調(diào)用靜態(tài)方法,要用類名嘟點(diǎn)的方式調(diào)用

2.所有覆寫的方法都要加@Override注解

3.最好不用可變參數(shù)這種方式去編程

4.不要使用過時(shí)的類和方法

5.外部正在調(diào)用或者二方庫依賴的接口畔裕,不允許修改方法簽名酣衷,避免對(duì)接口調(diào)用方產(chǎn)

生影響商虐。接口過時(shí)必須加@Deprecated 注解菊卷,并清晰地說明采用的新接口或者新服務(wù)是什

么囱淋;沒接觸過

6.Object的equal方法盡量不要用缀壤,要用常量或者已知確定不會(huì)為空的數(shù)字嘟點(diǎn)然后調(diào)用equals方法樊拓;昨天遇到了這個(gè)問題;

7.所有整型包裝類比較都要用equals方法 不要用==前面已經(jīng)說過了記住兩套 整型包裝類用equals比較诉位;在-128到127之間 可以==是true 超過這個(gè)范圍就未必了骑脱。記住記住苍糠;7-15中 有具體解釋

8.浮點(diǎn)數(shù)之間的等值判斷叁丧,基本數(shù)據(jù)類型不用== ,包裝類不用equals

推薦使用兩種方式第一,可以設(shè)置一個(gè)極小值 當(dāng)他們的比值小于這個(gè)數(shù)的時(shí)候就認(rèn)為相等

第二種 我能理解的就是使用BigDecimal這個(gè)類 拥娄,具體用到了再學(xué)吧

9.DO類對(duì)象的屬性要和數(shù)據(jù)庫中的屬性相同蚊锹;數(shù)據(jù)庫中 的 bigint必須和類中的Long對(duì)應(yīng);

10.為了防止精度丟失禁止使用BigDecimal的構(gòu)造方法將double傳進(jìn)去稚瘾,最好是傳入的參數(shù)類型為String牡昆;要不就BigDecimal bd = new BigDecimal(“1.22323”)或者

BigDecimal bd = BigDecimal.valueOf(1.232123)這個(gè)也可以,valueOf內(nèi)部是toString方法摊欠,就是把double的后面的零截取了轉(zhuǎn)換為一個(gè)String返回丢烘;

11.所有POJO類型和RPC類都需要使用包裝數(shù)據(jù)類型,記住就行了些椒,應(yīng)為查詢數(shù)據(jù)庫的時(shí)候有可能返回null播瞳,如果使用基本數(shù)據(jù)類接收 就會(huì)出現(xiàn)NPE;

12.序列化類新增屬性時(shí)免糕,請(qǐng)不要修改 serialVersionUID 字段赢乓,避免反序列失敗;如果

完全不兼容升級(jí),避免反序列化混亂石窑,那么請(qǐng)修改 serialVersionUID 值牌芋。不懂以后遇到再說

13.構(gòu)造方法中不要加入業(yè)務(wù)邏輯,需要添加業(yè)務(wù)邏輯的時(shí)候定一個(gè)init()方法松逊;

14.POJO 類必須寫 toString 方法躺屁。使用 IDE 中的工具:source> generate toString時(shí),如果繼承了另一個(gè) POJO 類棺棵,注意在前面加一下 super.toString楼咳。說明:在方法執(zhí)行拋出異常時(shí),可以直接調(diào)用 POJO 的 toString()方法打印其屬性值烛恤,便于排查問題母怜。

15.POJO類中不能同時(shí)有isxxx()和getxx()方法;

16.使用索引訪問用 String 的 split 方法得到的數(shù)組時(shí)缚柏,需做最后一個(gè)分隔符后有無內(nèi)

容的檢查苹熏,否則會(huì)有拋 IndexOutOfBoundsException 的風(fēng)險(xiǎn)。

17.循環(huán)體內(nèi)的字符串連接應(yīng)該使用StringBuilder類的append方法進(jìn)行拼接币喧,如果用循環(huán)+的方式進(jìn)行拼接轨域,那么每次+的時(shí)候都會(huì)從內(nèi)部產(chǎn)生一次StringBuilder,造成了內(nèi)存的浪費(fèi)

18.final 可以聲明類杀餐、成員變量干发、方法、以及本地變量史翘,下列情況使用 final 關(guān)鍵字:

他說可以也沒說必須

1) 不允許被繼承的類枉长,如:String 類冀续。//內(nèi)部已經(jīng)定好了干嘛要在這里再說一遍;

2) 不允許修改引用的域?qū)ο蟆?/這個(gè)好理解不允許修改必峰,還不加上

3) 不允許被覆寫的方法洪唐,如:POJO 類的 setter 方法。//沒遇到過啊自動(dòng)生成了

4) 不允許運(yùn)行過程中重新賦值的局部變量吼蚁。//常量凭需??肝匆?反正常量定義了也不能改

5) 避免上下文重復(fù)使用一個(gè)變量粒蜈,使用 final 可以強(qiáng)制重新定義一個(gè)變量,方便更好地進(jìn)行重構(gòu)术唬。

19.類成員與方法訪問控制從嚴(yán):

1) 如果不允許外部直接通過 new 來創(chuàng)建對(duì)象薪伏,那么構(gòu)造方法必須是 private。

2) 工具類不允許有 public 或 default 構(gòu)造方法粗仓。

3) 類非 static 成員變量并且與子類共享,必須是 protected设捐。

4) 類非 static 成員變量并且僅在本類使用借浊,必須是 private。

5) 類 static 成員變量如果僅在本類使用萝招,必須是 private蚂斤。

6) 若是 static 成員變量,考慮是否為 final槐沼。

7) 類成員方法只供類內(nèi)部調(diào)用曙蒸,必須是 private。

8) 類成員方法只對(duì)繼承類公開岗钩,那么限制為 protected纽窟。

集合處理

1.equals和hashcode方法:只要覆寫了equals必須覆寫hashcode;set存儲(chǔ)對(duì)象必須覆寫這兩個(gè)方法兼吓;自定義的map寫需要覆寫這兩個(gè)方法臂港;

2.ArrayList 的 subList 結(jié)果不可強(qiáng)轉(zhuǎn)成 ArrayList,否則會(huì)拋出 ClassCastException 異常视搏,subList 返回的是 ArrayList 的內(nèi)部類 SubList审孽,并不是 ArrayList 而是 ArrayList 的一個(gè)視圖,對(duì)于 SubList 子列表的所有操作最終會(huì)反映到原列表上浑娜。在subList場(chǎng)景中佑力,高度注意對(duì)原集合元素的增加或刪除,均會(huì)導(dǎo)致子列表的遍

歷筋遭、增加打颤、刪除產(chǎn)生 ConcurrentModificationException 異常暴拄。

集合這種list視圖還是第一次聽說

3.使用Map的方法keySet()/values()/entrySet()返回集合對(duì)象時(shí),不可以對(duì)其進(jìn)行添加元素操作瘸洛,否則會(huì)拋出 UnsupportedOperationException 異常

4.使用集合轉(zhuǎn)數(shù)組的方法揍移,必須使用集合的toArray(T[]array),傳入的是類型完全一致反肋、長度為 0 的空數(shù)組那伐。

List list = new ArrayList<>(2);

list.add("guan");

list.add("bao");

String[] array = list.toArray(new String[0]);

5.使用工具類Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時(shí),不能使用其修改集合相關(guān)的方法石蔗,它的 add/remove/clear 方法會(huì)拋出 UnsupportedOperationException 異常罕邀。說明:asList 的返回對(duì)象是一個(gè) Arrays 內(nèi)部類,并沒有實(shí)現(xiàn)集合的修改方法养距。Arrays.asList 體現(xiàn)的是適配器模式诉探,只是轉(zhuǎn)換接口,后臺(tái)的數(shù)據(jù)仍是數(shù)組棍厌。

public static void main(String[] args) {

String[] s =new String[] {"a","b","c","d"};

List list = Arrays.asList(s);

list.stream().forEach(i-> System.out.println(i));

list.set(0,"f");

//? ? ? ? list.add("f");? 這里就如文中所說的一樣會(huì)拋出異常肾胯;

? ? ? ? list.stream().forEach(i-> System.out.println(i));

s[0] ="a";

list.stream().forEach(i-> System.out.println(i));

}//這里可以看到只要set改變了值之后就會(huì)改變,然后數(shù)組改回來之后又編程了abcd耘纱;

6.泛型通配符<?extendsT>來接收返回的數(shù)據(jù)敬肚,此寫法的泛型集合不能使用add方法,而<? super T>不能使用 get 方法束析,作為接口調(diào)用賦值時(shí)易出錯(cuò)艳馒。說明:擴(kuò)展說一下 PECS(Producer Extends Consumer Super)原則:第一、頻繁往外讀取內(nèi)容的员寇,適合用<? extends T>弄慰。第二、經(jīng)常往里插入的蝶锋,適合用<? super T>

簡單來說就是 <? extends C> 上界為 C 類型范圍粗略理解為 [C,+∞)陆爽,不允許添加除 null 的元素,獲取的元素類型是 C 牲览;

<? super C> 下界為 C 類型范圍粗略理解為 (-∞,C]墓陈,允許添加 C 以及 C 的子類類型的元素,獲取的元素類型是 Object

add():編譯器只知道類型是 C 或 C 的子類第献,所以有可能是 C D E F 其中一個(gè)類型贡必,為保證類型安全不能添加除了 null 以外的任何元素,即使是 C 本身也不行

get():既然編譯器不知道此時(shí)集合中的元素是 C D E F 的哪一個(gè)庸毫,返回類型只能是他們共同父類 C 類型仔拟。


add():編譯器只知道類型是 C 或者 C 的父類,所以有可能是 A B C 其中一個(gè)類型飒赃。編譯器知道下界是 C 利花,根據(jù)類型向上兼容所以可以添加的元素是 C 以及 C 的子類(單車可以代表車)科侈。

get():既然編譯器不確定集合類型是 A B C 的哪一種,返回類型只能是他們的共同父類 Object 炒事。

特點(diǎn):<? extends C> 的 add() 被限制臀栈,<? super C> 的 get() 被限制

7.在無泛型限制定義的集合賦值給泛型限制的集合時(shí),在使用集合元素時(shí)挠乳,需要進(jìn)行instanceof 判斷权薯,避免拋出 ClassCastException 異常。

8.不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作睡扬。remove 元素請(qǐng)使用Iterator 方式盟蚣,如果并發(fā)操作,需要對(duì) Iterator 對(duì)象加鎖卖怜。面試的時(shí)候遇到過一次

9.高度注意 Map 類集合 K/V 能不能存儲(chǔ) null 值的情況屎开,如下表格:

集合類KeyValueSuper說明

Hashtable不允許為 null不允許為 nullDictionary線程安全

ConcurrentHashMap不允許為 null不允許為 nullAbstractMap鎖分段技術(shù)(JDK8:CAS)

TreeMap不允許為 null允許為 nullAbstractMap線程不安全

HashMap允許為 null允許為 nullAbstractMap線程不安全

反例:由于 HashMap 的干擾,很多人認(rèn)為 ConcurrentHashMap 是可以置入 null 值马靠,而事實(shí)上奄抽,存儲(chǔ)null 值時(shí)會(huì)拋出 NPE 異常。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甩鳄,一起剝皮案震驚了整個(gè)濱河市如孝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娩贷,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锁孟,死亡現(xiàn)場(chǎng)離奇詭異彬祖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)品抽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門储笑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人圆恤,你說我怎么就攤上這事突倍。” “怎么了盆昙?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵羽历,是天一觀的道長。 經(jīng)常有香客問我淡喜,道長秕磷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任炼团,我火速辦了婚禮澎嚣,結(jié)果婚禮上疏尿,老公的妹妹穿的比我還像新娘。我一直安慰自己易桃,他們只是感情好褥琐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晤郑,像睡著了一般敌呈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贩汉,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天驱富,我揣著相機(jī)與錄音,去河邊找鬼匹舞。 笑死褐鸥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赐稽。 我是一名探鬼主播叫榕,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼姊舵!你這毒婦竟也來了晰绎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤括丁,失蹤者是張志新(化名)和其女友劉穎荞下,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體史飞,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尖昏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了构资。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抽诉。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吐绵,靈堂內(nèi)的尸體忽然破棺而出迹淌,到底是詐尸還是另有隱情,我是刑警寧澤己单,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布唉窃,位于F島的核電站,受9級(jí)特大地震影響荷鼠,放射性物質(zhì)發(fā)生泄漏句携。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一允乐、第九天 我趴在偏房一處隱蔽的房頂上張望矮嫉。 院中可真熱鬧削咆,春花似錦、人聲如沸蠢笋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昨寞。三九已至瞻惋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間援岩,已是汗流浹背歼狼。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留享怀,地道東北人羽峰。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像添瓷,于是被迫代替她去往敵國和親梅屉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 傳送門 解讀阿里Java開發(fā)手冊(cè)(v1.1.1) - 異常日志 前言 阿里Java開發(fā)手冊(cè)談不上圣經(jīng)鳞贷,但確實(shí)是大量...
    kelgon閱讀 4,367評(píng)論 4 50
  • 本系列出于AWeiLoveAndroid的分享坯汤,在此感謝,再結(jié)合自身經(jīng)驗(yàn)查漏補(bǔ)缺搀愧,完善答案惰聂。以成系統(tǒng)。 Java基...
    濟(jì)公大將閱讀 1,529評(píng)論 1 6
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,701評(píng)論 0 3
  • 阿里巴巴 JAVA 開發(fā)手冊(cè) 1 / 32 Java 開發(fā)手冊(cè) 版本號(hào) 制定團(tuán)隊(duì) 更新日期 備 注 1.0.0 阿...
    糖寶_閱讀 7,597評(píng)論 0 5
  • 對(duì)象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法咱筛,而不是構(gòu)造函數(shù)創(chuàng)建對(duì)象:僅僅是創(chuàng)建對(duì)象的方法庶近,并非Fa...
    孫小磊閱讀 1,996評(píng)論 0 3