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

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

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

// Bad

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

// Good

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

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

2. 不要相信早期的JDK APIs

Java剛出現的時候,編程一定是件很痛苦的事。那時的API仍然不夠成熟,你可能曾經遇到過這樣一段代碼:

String[] files = file.list();

// Watch out

if (files != null) {

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

...

}

}

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

“如果抽象路徑名表示的不是一個目錄,那么這個方法返回null。否則返回一個字符串數組,其中每個字符串表示當前目錄下的一個文件或目錄。”

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

if (file.isDirectory()) {

String[] files = file.list();

// Watch out

if (files != null) {

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

...

}

}

}

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

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

我知道這很偏執,Javadoc中關于 String.indexOf() 的早期描述是這樣的…

“字符在字符序列中第一次出現的位置將作為結果[被返回],如果字符不存在則返回-1。”

所以,-1 就可以理所當然被拿來用,對嗎?我說不對,看看這個:

// Bad

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

// Good

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

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

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

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

是的。即使最優秀的程序員也可能犯這種錯誤(當然,不包括我。看#7)。

(假設這是JavaScript,我們暫且偏執地認為是這種語言)

// Ooops

if (variable = 5) { ... }

// Better (because causes an error)

if (5 = variable) { ... }

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

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

再說一遍。如果你的表達式中有常量,將它放在等式左邊。這樣當你打算再添加一個 = 時,不容易出錯。

?如果你在學習Java的過程中或者在工作中遇到什么問題都可以來群里提問,阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!可以加群找我要課堂鏈接 注意:是免費的 沒有開發經驗誤入哦! 非喜勿入!?學習交流QQ群:478052716

5. 檢查null和長度

不管什么時候你有一個集合、數組或者其他的,確保它存在并且不為空。

// Bad

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

// Good

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

你不知道這些數組來自哪兒,也許是早期的JDK API呢?

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

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

// Bad

public void boom() { ... }

// Good. Don't touch.

public final void dontTouch() { ... }

是的,寫成final。如果這樣做對你來說沒有意義,你也可以通過修改或重寫字節碼來改變類和方法,或者發送功能請求。我敢肯定重寫類/方法并不是一個好主意。

7. 所有的變量和參數都用 final 聲明

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

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

// Bad

void input(String importantMessage) {

String answer = "...";

answer = importantMessage = "LOL accident";

}

// Good

final void input(final String importantMessage) {

final String answer = "...";

}

好吧,我承認,這一條我自己也不常用,雖然我應該用。我希望Java能像Scala語言一樣,人們在所有地方都直接用 val 來表示變量,甚至都不考慮易變性,除非明確需要的時候他們才用 var 來聲明變量,但是這樣的機會特別少。

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

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

思考一下這個:

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

相信我,我看過的多了,還有這樣的

所以說偏執是有好處的。

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

Switch…作為最滑稽的表達式之一,我不知道是該心存敬畏還是默默哭泣。不管怎樣,我們既然無法擺脫 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");

}

因為在當 value=3 被引入到軟件中的時候,default 就能發揮作用,使其正常運行!別和我提 enum 類型,因為這對 enums 也一樣適用。

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

事實上,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不是真正意義上的語句,他們更像是標簽,而switch就是指向這些標簽的goto語句。事實上,你甚至可以把case語句和 驚人的FORTRAN77項聲明 類比,對于FORTRAN,它的神秘已經超越了它的功能。

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容