這9條不得不提的Java編程技巧讓你受益終生!

姓名:鄭紅????????????? 學(xué)號(hào):17101223385

本文轉(zhuǎn)自http://news.51cto.com/art/201711/558501.htm

【嵌牛導(dǎo)讀】:好的習(xí)慣是成功的一半读跷。因?yàn)椋阒溃叭魏慰赡艹鲥e(cuò)的事情缕贡,最后都會(huì)出錯(cuò)〖鸩ィ”這就是人們?yōu)槭裁聪矚g進(jìn)行“防錯(cuò)性程序設(shè)計(jì)”的原因晾咪。下面我列出的的個(gè)人感覺最有用而又偏執(zhí)的10項(xiàng)Java編程技巧。

【嵌牛鼻子】:java

【嵌牛提問(wèn)】:怎么避免意外賦值贮配?

【嵌牛正文】


1.把字符串常量放在前面(技術(shù)文)

通過(guò)把字符串常量放在比較函數(shù)equals()比較項(xiàng)的左側(cè)來(lái)防止偶然的NullPointerException從來(lái)都不是一個(gè)壞主意谍倦,就像這樣:

// Bad

if (variable.equals("literal")) { ... }

// Good

if ("literal".equals(variable)) { ... }

這是毫無(wú)疑問(wèn)的,把一種表達(dá)式轉(zhuǎn)換成另一種更好的表達(dá)式泪勒,并不會(huì)失去什么昼蛀。只要我們的Options是真實(shí)存在的(Java 8中Optional是對(duì)可以為空的對(duì)象進(jìn)行的封裝),不是嗎圆存?討論一下…

2.不要相信早期的JDK APIs

Java剛出現(xiàn)的時(shí)候叼旋,編程一定是件很痛苦的事。那時(shí)的API仍然不夠成熟沦辙,你可能曾經(jīng)遇到過(guò)這樣一段代碼:

String[] files = file.list();

// Watch out

if (files != null) {

for (int i = 0; i < files.length; i++) {

...

}

}

看起來(lái)很奇怪對(duì)嗎夫植?也許吧,但是看看這個(gè)Javadoc:

“如果抽象路徑名表示的不是一個(gè)目錄油讯,那么這個(gè)方法返回null偷崩。否則返回一個(gè)字符串?dāng)?shù)組,其中每個(gè)字符串表示當(dāng)前目錄下的一個(gè)文件或目錄撞羽〔保”

是的,最好再加上判空檢查诀紊,以確保正確:

if (file.isDirectory()) {

String[] files = file.list();

// Watch out

if (files != null) {

for (int i = 0; i < files.length; i++) {

...

}

}

1}

糟糕谒出!因此一定要記得判null檢查!

3.不要相信“-1”(技術(shù)文)

我知道這很偏執(zhí)邻奠,Javadoc中關(guān)于String.indexOf()的早期描述是這樣的…

“字符在字符序列中第一次出現(xiàn)的位置將作為結(jié)果[被返回]笤喳,如果字符不存在則返回-1÷笛纾”

所以杀狡,-1就可以理所當(dāng)然被拿來(lái)用,對(duì)嗎贰镣?我說(shuō)不對(duì)呜象,看看這個(gè):

// Bad

if (string.indexOf(character) != -1) { ... }

// Good

if (string.indexOf(character) >= 0) { ... }

誰(shuí)知道呢膳凝。也許在某個(gè)特定場(chǎng)合下他們將會(huì)需要另一種 編碼值,如果不區(qū)分大小寫的話恭陡,otherString就會(huì)被包含進(jìn)去…此時(shí)或許可以返回-2呢蹬音?誰(shuí)知道呢。

畢竟休玩,我們有非常多關(guān)于NULL——價(jià)值億萬(wàn)美金的錯(cuò)誤 (https://blog.jooq.org/2015/07/22/null-is-not-the-billion-dollar-mistake-a-counter-rant/)的討論著淆。為什么不開始討論-1呢,某種意義上來(lái)說(shuō)-1是null在int類型下的另一種形式拴疤。

4.避免意外的賦值(技術(shù)文)

是的永部。即使最優(yōu)秀的程序員也可能犯這種錯(cuò)誤(當(dāng)然,不包括我呐矾√β瘢看#7)。

(假設(shè)這是JavaScript凫佛,我們暫且偏執(zhí)地認(rèn)為是這種語(yǔ)言)

// Ooops

if (variable = 5) { ... }

// Better (because causes an error)

if (5 = variable) { ... }

// Intent (remember. Paranoid JavaScript: ===)

if (5 === variable) { ... }

再說(shuō)一遍讲坎。如果你的表達(dá)式中有常量孕惜,將它放在等式左邊愧薛。這樣當(dāng)你打算再添加一個(gè)=時(shí),不容易出錯(cuò)衫画。

5.檢查null和長(zhǎng)度

不管什么時(shí)候你有一個(gè)集合毫炉、數(shù)組或者其他的,確保它存在并且不為空削罩。

// Bad

if (array.length > 0) { ... }

// Good

if (array != null && array.length > 0) { ... }

你不知道這些數(shù)組來(lái)自哪兒瞄勾,也許是早期的JDK API呢?

6.所有的方法都用final聲明(技術(shù)文)

你可以告訴我任何你想要的開閉原則弥激,不過(guò)那都是胡說(shuō)八道进陡。我不相信你(可以正確繼承我的類),也不相信我自己(不會(huì)意外地繼承我的類)微服。因此除了接口(專門用于繼承)都應(yīng)該是嚴(yán)格的final趾疚。可以查看我們的Java編碼中10個(gè)微妙的最佳實(shí)踐 中的#9以蕴。

// Bad

public void boom() { ... }

// Good. Don't touch.

public final void dontTouch() { ... }

是的糙麦,寫成final。如果這樣做對(duì)你來(lái)說(shuō)沒(méi)有意義丛肮,你也可以通過(guò)修改或重寫字節(jié)碼來(lái)改變類和方法赡磅,或者發(fā)送功能請(qǐng)求。我敢肯定重寫類/方法并不是一個(gè)好主意宝与。

7.重載的時(shí)候不要相信泛型(技術(shù)文)

是的,這是會(huì)發(fā)生的佛掖。你覺得你寫了一個(gè)超好的API椰弊,它真的是既酷炫又直觀;接著就出現(xiàn)了一群用戶徙硅,他們只是把一切類型生搬硬套進(jìn)Object中 直到那該死的編譯器停止工作,然后他們突然鏈接到了錯(cuò)誤的方法搞疗,認(rèn)為這一切都是你的錯(cuò)(事情總是這樣)嗓蘑。

思考一下這個(gè):

// Bad

void bad(T value) {

bad(Collections.singletonList(value));

}

void bad(List values) {

...

}

// Good

final void good(final T value) {

if (value instanceof List)

good((List) value);

else

good(Collections.singletonList(value));

}

final void good(final List values) {

...

}

因?yàn)椋阒赖摹愕挠脩魝兡淠耍麄兙拖襁@樣

// This library sucks

@SuppressWarnings("all")

Object t = (Object) (List) Arrays.asList("abc");

bad(t);

相信我桩皿,我看過(guò)的多了,還有這樣的

所以說(shuō)偏執(zhí)是有好處的幢炸。

8.總是在switch語(yǔ)句里加上default(好技術(shù)文)

Switch…作為最滑稽的表達(dá)式之一泄隔,我不知道是該心存敬畏還是默默哭泣。不管怎樣宛徊,我們既然無(wú)法擺脫switch佛嬉,在必要的時(shí)候我們最好能夠正確使用它,例如:

// Bad

switch (value) {

case 1: foo(); break;

case 2: bar(); break;

}

// Good

switch (value) {

case 1: foo(); break;

case 2: bar(); break;

default:

throw new ThreadDeath("That'll teach them");

}

因?yàn)樵诋?dāng)value=3被引入到軟件中的時(shí)候闸天,default就能發(fā)揮作用暖呕,使其正常運(yùn)行!別和我提enum類型苞氮,因?yàn)檫@對(duì)enums也一樣適用湾揽。

9.用大括號(hào)隔開switch的每一個(gè)case塊(技術(shù)文)

事實(shí)上,switch是最坑爹的語(yǔ)句笼吟,任何喝醉了或是賭輸了的人都可以在某種語(yǔ)言中使用它库物。看看下面這個(gè)例子:

// Bad, doesn't compile

switch (value) {

case 1: int j = 1; break;

case 2: int j = 2; break;

}

// Good

switch (value) {

case 1: {

final int j = 1;

break;

}

case 2: {

final int j = 2;

break;

}

// Remember:

default:

throw new ThreadDeath("That'll teach them");

}

在switch語(yǔ)句中贷帮,為所有的case都只定義了一個(gè)作用域戚揭。事實(shí)上,這些case不是真正意義上的語(yǔ)句撵枢,他們更像是標(biāo)簽民晒,而switch就是指向這些標(biāo)簽的goto語(yǔ)句。事實(shí)上诲侮,你甚至可以把case語(yǔ)句和 驚人的FORTRAN77項(xiàng)聲明 類比镀虐,對(duì)于FORTRAN,它的神秘已經(jīng)超越了它的功能沟绪。

這意味著變量final int j可以被任何case訪問(wèn)刮便,不論我們是否有break≌来龋看起來(lái)并不是很直觀恨旱。我們可以通過(guò)添加簡(jiǎn)單的花括號(hào)為每一個(gè)case創(chuàng)建一個(gè)新的嵌套的作用域辈毯,當(dāng)然不要忘了在每個(gè)case的語(yǔ)句塊最后加break。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搜贤,一起剝皮案震驚了整個(gè)濱河市谆沃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仪芒,老刑警劉巖唁影,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異掂名,居然都是意外死亡据沈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門饺蔑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锌介,“玉大人,你說(shuō)我怎么就攤上這事猾警】谆觯” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵发皿,是天一觀的道長(zhǎng)崔慧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)雳窟,這世上最難降的妖魔是什么尊浪? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任匣屡,我火速辦了婚禮封救,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捣作。我一直安慰自己誉结,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布券躁。 她就那樣靜靜地躺著惩坑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪也拜。 梳的紋絲不亂的頭發(fā)上以舒,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音慢哈,去河邊找鬼蔓钟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卵贱,可吹牛的內(nèi)容都是我干的滥沫。 我是一名探鬼主播侣集,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼兰绣!你這毒婦竟也來(lái)了世分?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缀辩,失蹤者是張志新(化名)和其女友劉穎臭埋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臀玄,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斋泄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镐牺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炫掐。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖睬涧,靈堂內(nèi)的尸體忽然破棺而出募胃,到底是詐尸還是另有隱情,我是刑警寧澤畦浓,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布痹束,位于F島的核電站,受9級(jí)特大地震影響讶请,放射性物質(zhì)發(fā)生泄漏祷嘶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一夺溢、第九天 我趴在偏房一處隱蔽的房頂上張望论巍。 院中可真熱鬧,春花似錦风响、人聲如沸嘉汰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鞋怀。三九已至,卻和暖如春持搜,著一層夾襖步出監(jiān)牢的瞬間密似,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工葫盼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留残腌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像废累,于是被迫代替她去往敵國(guó)和親邓梅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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