程序員看過來!這10條不得不提的java編程技巧讓你受益終生损离!

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

通過把字符串常量放在比較函數(shù)equals()比較項的左側(cè)來防止偶然的 NullPointerException 從來都不是一個壞主意哥艇,就像這樣:

// Bad

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

// Good

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

這是毫無疑問的,把一種表達(dá)式轉(zhuǎn)換成另一種更好的表達(dá)式僻澎,并不會失去什么貌踏。只要我們的Options是真實存在的(Java 8中 Optional是對可以為空的對象進行的封裝),不是嗎窟勃?討論一下…

2. 不要相信早期的JDK APIs

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

String[] files = file.list();

// Watch out

if (files != null) {

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

...

}

}

看起來很奇怪對嗎眷昆?也許吧,但是看看這個Javadoc:

“如果抽象路徑名表示的不是一個目錄谬运,那么這個方法返回null隙赁。否則返回一個字符串?dāng)?shù)組垦藏,其中每個字符串表示當(dāng)前目錄下的一個文件或目錄梆暖。”

是的掂骏,最好再加上判空檢查轰驳,以確保正確:

if (file.isDirectory()) {

String[] files = file.list();

// Watch out

if (files != null) {

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

...

}

}

}

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

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

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

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

所以抡爹,-1 就可以理所當(dāng)然被拿來用,對嗎芒划?我說不對冬竟,看看這個:

// Bad

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

// Good

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

誰知道呢。也許在某個特定場合下他們將會需要另一種 編碼值民逼,如果不區(qū)分大小寫的話泵殴,otherString 就會被包含進去…此時或許可以返回 -2呢?誰知道呢拼苍。

畢竟笑诅,我們有非常多關(guān)于NULL——價值億萬美金的錯誤 (https://blog.jooq.org/2015/07/22/null-is-not-the-billion-dollar-mistake-a-counter-rant/)的討論。為什么不開始討論 -1呢疮鲫,某種意義上來說 -1 是 null 在int類型下的另一種形式吆你。

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

是的。即使最優(yōu)秀的程序員也可能犯這種錯誤(當(dāng)然俊犯,不包括我早处。看#7)瘫析。

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

// Ooops

if (variable = 5) { ... }

// Better (because causes an error)

if (5 = variable) { ... }

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

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

再說一遍。如果你的表達(dá)式中有常量但壮,將它放在等式左邊浦译。這樣當(dāng)你打算再添加一個 = 時,不容易出錯杖虾。

?如果你在學(xué)習(xí)Java的過程中或者在工作中遇到什么問題都可以來群里提問烂瘫,阿里Java高級大牛直播講解知識點,分享知識奇适,多年工作經(jīng)驗的梳理和總結(jié)坟比,帶著大家全面、科學(xué)地建立自己的技術(shù)體系和技術(shù)認(rèn)知嚷往!可以加群找我要課堂鏈接 注意:是免費的 沒有開發(fā)經(jīng)驗誤入哦! 非喜勿入葛账!?學(xué)習(xí)交流QQ群:478052716

5. 檢查null和長度

不管什么時候你有一個集合、數(shù)組或者其他的皮仁,確保它存在并且不為空籍琳。

// Bad

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

// Good

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

你不知道這些數(shù)組來自哪兒菲宴,也許是早期的JDK API呢?

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

你可以告訴我任何你想要的開閉原則趋急,不過那都是胡說八道喝峦。我不相信你(可以正確繼承我的類),也不相信我自己(不會意外地繼承我的類)呜达。因此除了接口(專門用于繼承)都應(yīng)該是嚴(yán)格的 final谣蠢。可以查看我們的 Java 編碼中 10 個微妙的最佳實踐 中的#9查近。

// Bad

public void boom() { ... }

// Good. Don't touch.

public final void dontTouch() { ... }

是的漩怎,寫成final。如果這樣做對你來說沒有意義嗦嗡,你也可以通過修改或重寫字節(jié)碼來改變類和方法勋锤,或者發(fā)送功能請求。我敢肯定重寫類/方法并不是一個好主意侥祭。

7. 所有的變量和參數(shù)都用 final 聲明

就像我說的叁执。我不相信自己不會無意間重寫了某個值。這么說來矮冬,我的確一點都不相信自己谈宛。因為:

這也是為什么所有的變量和參數(shù)都用final聲明的原因。

// Bad

void input(String importantMessage) {

String answer = "...";

answer = importantMessage = "LOL accident";

}

// Good

final void input(final String importantMessage) {

final String answer = "...";

}

好吧胎署,我承認(rèn)吆录,這一條我自己也不常用,雖然我應(yīng)該用琼牧。我希望Java能像Scala語言一樣恢筝,人們在所有地方都直接用 val 來表示變量,甚至都不考慮易變性巨坊,除非明確需要的時候他們才用 var 來聲明變量撬槽,但是這樣的機會特別少。

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

是的趾撵,這是會發(fā)生的侄柔。你覺得你寫了一個超好的API,它真的是既酷炫又直觀占调;接著就出現(xiàn)了一群用戶暂题,他們只是把一切類型生搬硬套進 Object 中 直到那該死的編譯器停止工作,然后他們突然鏈接到了錯誤的方法究珊,認(rèn)為這一切都是你的錯(事情總是這樣)薪者。

思考一下這個:

// 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) {

...

}

因為,你知道的…你的用戶們苦银,他們就像這樣

// This library sucks

@SuppressWarnings("all")

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

bad(t);

相信我啸胧,我看過的多了赶站,還有這樣的

所以說偏執(zhí)是有好處的幔虏。

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

Switch…作為最滑稽的表達(dá)式之一纺念,我不知道是該心存敬畏還是默默哭泣。不管怎樣想括,我們既然無法擺脫 switch 陷谱,在必要的時候我們最好能夠正確使用它,例如:

// 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");

}

因為在當(dāng) value=3 被引入到軟件中的時候瑟蜈,default 就能發(fā)揮作用烟逊,使其正常運行!別和我提 enum 類型铺根,因為這對 enums 也一樣適用宪躯。

10. 用大括號隔開 switch 的每一個 case 塊(技術(shù)文)

事實上,switch是最坑爹的語句位迂,任何喝醉了或是賭輸了的人都可以在某種語言中使用它访雪。看看下面這個例子:

// 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語句中掂林,為所有的case都只定義了一個作用域臣缀。事實上,這些case不是真正意義上的語句泻帮,他們更像是標(biāo)簽精置,而switch就是指向這些標(biāo)簽的goto語句。事實上锣杂,你甚至可以把case語句和 驚人的FORTRAN77項聲明 類比脂倦,對于FORTRAN,它的神秘已經(jīng)超越了它的功能元莫。

這意味著變量final int j 可以被任何case訪問狼讨,不論我們是否有break∑饩海看起來并不是很直觀政供。我們可以通過添加簡單的花括號為每一個case創(chuàng)建一個新的嵌套的作用域,當(dāng)然不要忘了在每個 case 的語句塊最后加 break朽基。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末布隔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子稼虎,更是在濱河造成了極大的恐慌衅檀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霎俩,死亡現(xiàn)場離奇詭異哀军,居然都是意外死亡沉眶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門杉适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谎倔,“玉大人,你說我怎么就攤上這事猿推∑埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵蹬叭,是天一觀的道長藕咏。 經(jīng)常有香客問我,道長秽五,這世上最難降的妖魔是什么孽查? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮坦喘,結(jié)果婚禮上盲再,老公的妹妹穿的比我還像新娘。我一直安慰自己起宽,他們只是感情好洲胖,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坯沪,像睡著了一般绿映。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腐晾,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天叉弦,我揣著相機與錄音,去河邊找鬼藻糖。 笑死淹冰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巨柒。 我是一名探鬼主播樱拴,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼洋满!你這毒婦竟也來了晶乔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤牺勾,失蹤者是張志新(化名)和其女友劉穎正罢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驻民,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡翻具,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年履怯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裆泳。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡叹洲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晾虑,到底是詐尸還是另有隱情疹味,我是刑警寧澤仅叫,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布帜篇,位于F島的核電站,受9級特大地震影響诫咱,放射性物質(zhì)發(fā)生泄漏笙隙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一坎缭、第九天 我趴在偏房一處隱蔽的房頂上張望竟痰。 院中可真熱鬧,春花似錦掏呼、人聲如沸坏快。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莽鸿。三九已至,卻和暖如春拾给,著一層夾襖步出監(jiān)牢的瞬間祥得,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工蒋得, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留级及,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓额衙,卻偏偏與公主長得像饮焦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窍侧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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

  • 姓名:鄭紅 學(xué)號:17101223385 本文轉(zhuǎn)自http://news.51cto.com/art/201711...
    蘋果941024閱讀 139評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法疏之,類相關(guān)的語法殿雪,內(nèi)部類的語法,繼承相關(guān)的語法锋爪,異常的語法丙曙,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 經(jīng)過一段時間的編碼(咦爸业,我已經(jīng)經(jīng)歷了將近20年的編程生涯,快樂的日子總是過得很快)亏镰,我們開始感謝那些好習(xí)慣扯旷。因為,...
    南屋阿米佛頭閱讀 374評論 0 1
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗索抓。 張土汪:刷leetcod...
    土汪閱讀 12,724評論 0 33
  • 入睡時 誰翻動了桌上的書頁 留下無關(guān)緊要的字句 路過的小路上 誰灑滿了紅漿果 送你一段童話般的夢境 誰曾一再進入夢...
    若良閱讀 328評論 2 3