溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中的魔法值概念是什么

發(fā)布時(shí)間:2022-02-07 15:56:44 來(lái)源:億速云 閱讀:307 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Java中的魔法值概念是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java中的魔法值概念是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

    Java中的魔法值

    背景

    使用IDEA時(shí),啟用了阿里的代碼規(guī)范檢查,其中就有一項(xiàng)提示是不允許任何魔法值出現(xiàn)在代碼里,于是出于好奇就了解一下到底啥時(shí)魔法值。

    介紹

    魔法數(shù)值、魔法數(shù)字、魔法值,這是一個(gè)東西,不同的叫法。

    魔法數(shù)字,在編程領(lǐng)域指的是莫名其妙出現(xiàn)的數(shù)字。數(shù)字的意義必須通過(guò)詳細(xì)閱讀才能推斷出來(lái)

    if("1".equals(dangerKey)){
                BigDecimal warningValue = new BigDecimal(JedisUtils.get(WARNING_VALUE_KEY));
                model.addAttribute("isDanger", true);
                model.addAttribute("warningValue", warningValue);
            }

    上面代碼中的字符串1就是一個(gè)魔法值,在未讀整段代碼之前,我并不知道這個(gè)字符串1代表什么意思,只有把這個(gè)字符串帶入后面的代碼邏輯才能判斷該值的真實(shí)意義,而且如果多次出現(xiàn),這就大大的降低了代碼的可閱讀性。所以我們?cè)诖a中應(yīng)該極力避免產(chǎn)生魔法值。

    解決方法

    ** 使用枚舉類型或者使用static final修飾常量 **

    //預(yù)警值標(biāo)識(shí)
        public static final String DANGERKEY_TRUE ="1";
        if(DANGERKEY_TRUE.equals(dangerKey)){
                BigDecimal warningValue = new BigDecimal(JedisUtils.get(WARNING_VALUE_KEY));
                model.addAttribute("isDanger", true);
                model.addAttribute("warningValue", warningValue);
            }

    以上就是使用static final的方式替換的魔法值,這樣就可以避免了。如果在代碼中多次使用的話,只需更聲明的地方就可以達(dá)到全局的效果。

    提示:靜態(tài)常量的命名最好全是大寫字母,如果是多個(gè)單詞需要分割,可以使用下劃線分割。

    小結(jié):魔法值的問(wèn)題對(duì)于代碼邏輯來(lái)說(shuō),并不是什么要命的事情,即使不修改也基本不影響代碼的正常運(yùn)行,我以前沒(méi)有安裝阿里代碼檢查規(guī)范時(shí),一樣這么使用,也沒(méi)出現(xiàn)過(guò)啥問(wèn)題。好吧,應(yīng)該說(shuō)但是了。但是,遵循公認(rèn)的代碼規(guī)范,可以有效的避免開(kāi)發(fā)過(guò)程的一些小問(wèn)題(最讓人頭疼的往往都是一些小問(wèn)題引起的),提升開(kāi)發(fā)的效率和代碼的可閱讀性,老老實(shí)實(shí)按照規(guī)范來(lái),自然就會(huì)受益良多,繼續(xù)加油! 

    Java的魔法值概念

    想象一下,當(dāng)你入職一家新公司,打開(kāi)工具看以前同事的項(xiàng)目時(shí),突然看到下面這段代碼

    String[] catNames = new String[7];
    String[] dogNames = new String[7];
    for(int i = 0; i < 7; i++) {
        //此處省略若干行
    }

    你心中一定很凌亂,可能還會(huì)在心底默默問(wèn)候下寫這段代碼的前同事。

    在沒(méi)有注釋的情況下,此處的i < 7,你根本無(wú)法知道是要處理 dogNames數(shù)組還是catNames數(shù)組,你還要繼續(xù)去看循環(huán)體中的內(nèi)容才能來(lái)推斷這個(gè)數(shù)字的含義。這里的7就是魔法值。

    所謂的魔法值,就是指在代碼中直接出現(xiàn)的數(shù)值,只有在這個(gè)數(shù)值記述的那部分代碼中才能明確了解其含義。

    魔法值簡(jiǎn)單好用,任何項(xiàng)目基本上都會(huì)有魔法值的出現(xiàn)。但魔法值就像一段沒(méi)有注釋的代碼,它的出現(xiàn)使得程序的可讀性大大下降,甚至只有當(dāng)事人才知道。這對(duì)于項(xiàng)目或者別的開(kāi)發(fā)來(lái)說(shuō),無(wú)疑都是不利的。同時(shí),如果到處用到魔法值,那需要修改的時(shí)候,就要修改很多地方,這不僅耗費(fèi)時(shí)間,還很容易會(huì)遺漏。

    魔法值的問(wèn)題就是含義不明且無(wú)法統(tǒng)一使用,要把它們統(tǒng)一表示,并加上注釋,我們可以用static final 定義常量或使用enum值。

    static final int CAT_NUM = 7;
    String[] catNames = new String[CAT_NUM];
    for(int i = 0; i < CAT_NUM; i++) {
        //此處省略若干行
    }
    for(int i = 0; i < PET.DOG.getNum(); i++) {
        //此處省略若干行
    }

    當(dāng)然此處用catNames.length,dogNames.length也不會(huì)引起混淆。

    其實(shí)魔法值也并不是要完全禁止不用,畢竟每次用到數(shù)值就要去定義常量或者在enum中新增元素還是很麻煩的。只要保障你的數(shù)值不會(huì)讓別人難以閱讀,你就可以使用魔法值。一般 -1、0 和 1不被視為魔法值。

    讀到這里,這篇“Java中的魔法值概念是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI