更多課程 選擇中心
        Java培訓

        400-111-8989

        Java培訓 > Java教程  > 正文

        偏執卻有用的Java編程技術

        • 發布:佚名
        • 來源:智聯招聘
        • 時間:2016-05-20 18:06

        在沉浸于編碼一段時間以后,你就會漸漸明白任何事情有可能出錯,這就是為什么我們要采用“防御性編程”,即一些偏執習慣的原因。下面是達內java培訓(www.sabdns.com)專家為大家整理的大牛眼中的10個最有用但偏執的Java編程技術。一起來看一看吧:

        1、將String字符串放在最前面

        為了防止偶發性的NullPointerException異常,我們通常將String放置在equals()函數的左邊來實現字符串比較,如下代碼:

        // Bad

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

        // Good

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

        這是隨便用腦子想想就可以做的事,從Bad版本的代碼改寫表達式到Good版本的代碼,這中間并不會丟失任何東西。歡迎不同的觀點…

        2、不要相信早期的JDK API

        在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++) {

                    ...

                }

            }

        }

        3、不要相信“-1”

        我知道這是偏執的,但Javadoc中對String.indexOf()方法明確指出:對象內第一次出現指定字符的位置索引,如果為-1則表示該字符不在字符序列中。

        所以使用-1是理所當然的,對嗎?我說不對,請看以下代碼:

        // Bad

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

        // Good

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

        誰知道呢。也許到時候他們改變了編碼方式,對字符串并不區分大小寫,也許更好的方式是返回-2?誰知道呢。

        4、避免意外賦值

        是的。這種事情也許經常會發生。

        // Ooops

        if (variable = 5) { ... }

        // Better (because causes an error)

        if (5 = variable) { ... }

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

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

        所以你可以將比較常量放置在左側,這樣就不會發生意外賦值的錯誤了。

        5、檢查Null和Length

        無論如何,只要你有一個集合、數組等,請確保它存在,并且不為空。

        // Bad

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

        // Good

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

        你并不知道這些數組從哪里來,也許是來自早期版本的JDK API,誰知道呢。

        6、所有的方法都是final的

        你也許會告訴我你的開/閉原則,但這都是胡說八道。我不相信你(正確繼承我這個父類的所有子類),我也不相信我自己(不小心繼承我這個父類的所有子類)。所以對于那些意義明確的方法要嚴格用final標識。

        // Bad

        public void boom() { ... }

        // Good. Don't touch.

        public final void dontTouch() { ... }

        7、所有變量和參數都是final

        // Bad

        void input(String importantMessage) {

            String answer = "...";

            answer = importantMessage = "LOL accident";

        }

        // Good

        final void input(final String importantMessage) {

            final String answer = "...";

        }

        8、重載時不要相信泛型

        是,它可以發生。你相信你寫的超級好看的API,它很直觀,隨之而來的,一些用戶誰只是將原始類型轉換成Object類型,直到那該死的編譯器停止發牢騷,并且突然他們會鏈接錯誤的方法,以為這是你的錯誤。

        看下面的代碼:

        // Bad

        <T> void bad(T value) {

            bad(Collections.singletonList(value));

        }

        <T> void bad(List<T> values) {

            ...

        }

        // Good

        final <T> void good(final T value) {

            if (value instanceof List)

                good((List<?>) value);

            else

                good(Collections.singletonList(value));

        }

        final <T> void good(final List<T> 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時,將會出現無法找到的提示,而不會讓人不知所謂。

        10、Switch語句帶花括號

        事實上,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語句甚至不是真正的語句,他們就像goto語句中的跳轉標記一樣。

        結論

        偏執編程看起來似乎不可思議,有時,因為代碼經常被證明是更詳細一點,但并不是需求需要。你可能會想,“哦,這是絕不會發生的”,但正如達內java培訓(www.sabdns.com)專家所說。經過20年左右的時間編程,你不希望只修復這些愚蠢的bug。

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:達內電信計費系統項目介紹
        下一篇:Java常用第三方庫大全
        2021版Java學習路線圖(超詳細)

        2021版Java學習路線圖(超詳細)

        Java面向對象系列全套視頻教程(更新中...)

        Java面向對象系列全套視頻教程(更新中...)

        從事Java后端開發,要學習哪些知識和技能?

        從事Java后端開發,要學習哪些知識和技能?

        Java后端開發需要掌握哪些技能?

        Java后端開發需要掌握哪些技能?

        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        貴州省

        福建省

        • 達內廈門軟件園中心
        廣西省

        海南省

        国产高清情侣视频2019年,限制电影福利在线观看,23伊人大香蕉 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>