<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    asklxf

    A java developer's notebook.

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    最新評(píng)論

    JDK源碼分析:java.lang.Boolean

    閑來(lái)無(wú)事,開(kāi)始研究JDK源碼(jdk 1.5 b2),先找了一個(gè)最簡(jiǎn)單的java.lang.Boolean開(kāi)始解剖。

    由于水平有限,難免有不少錯(cuò)誤,還請(qǐng)大家指正!

    首先我們剔除所有的方法和靜態(tài)變量,Boolean的核心代碼如下:

    public final class Boolean implements java.io.Serializable,Comparable
    {
        private final boolean value;
    }

    很明顯,凡是成員變量都是final類(lèi)型的,一定是immutable class,這個(gè)Boolean和String一樣,一旦構(gòu)造函數(shù)執(zhí)行完畢,實(shí)例的狀態(tài)就不能再改變了。

    Boolean的構(gòu)造函數(shù)有兩個(gè):

    public Boolean(boolean value) {
        this.value = value;
    }
    public Boolean(String s) {
        this(toBoolean(s));
    }

    都很簡(jiǎn)單就不多說(shuō)了。

    另外注意到Boolean類(lèi)實(shí)際上只有兩種不同狀態(tài)的實(shí)例:一個(gè)包裝true,一個(gè)包裝false,Boolean又是immutable class,所以在內(nèi)存中相同狀態(tài)的Boolean實(shí)例完全可以共享,不必用new創(chuàng)建很多實(shí)例。因此Boolean class還提供兩個(gè)靜態(tài)變量:

    public static final Boolean TRUE = new Boolean(true);
    public static final Boolean FALSE = new Boolean(false);

    這兩個(gè)變量在Class Loader裝載時(shí)就被實(shí)例化,并且申明為final,不能再指向其他實(shí)例。

    提供這兩個(gè)靜態(tài)變量是為了讓開(kāi)發(fā)者直接使用這兩個(gè)變量而不是每次都new一個(gè)Boolean,這樣既節(jié)省內(nèi)存又避免了創(chuàng)建一個(gè)新實(shí)例的時(shí)間開(kāi)銷(xiāo)。

    因此,用
        Boolean b = Boolean.TRUE;

        Boolean b = new Boolean(true);
    要好得多。

    如果遇到下面的情況:
        Boolean b = new Boolean(var);
    一定要根據(jù)一個(gè)boolean變量來(lái)創(chuàng)建Boolean實(shí)例怎么辦?

    推薦你使用Boolean提供的靜態(tài)工廠方法:
        Boolean b = Boolean.valueOf(var);
    這樣就可以避免創(chuàng)建新的實(shí)例,不信看看valueOf()靜態(tài)方法:

    public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }

    這個(gè)靜態(tài)工廠方法返回的仍然是兩個(gè)靜態(tài)變量TRUE和FALSE之一,而不是new一個(gè)Boolean出來(lái)。雖然Boolean非常簡(jiǎn)單,占用的內(nèi)存也很少,但是一個(gè)復(fù)雜的類(lèi)用new創(chuàng)建實(shí)例的開(kāi)銷(xiāo)可能非常大,而且,使用工廠方法可以方便的實(shí)現(xiàn)緩存實(shí)例,這對(duì)客戶(hù)端是透明的。所以,能用工廠方法就不要用new。

    和Boolean只有兩種狀態(tài)不同,Integer也是immutable class,但是狀態(tài)上億種,不可能用靜態(tài)實(shí)例緩存所有狀態(tài)。不過(guò),SUN的工程師還是作了一點(diǎn)優(yōu)化,Integer類(lèi)緩存了-128到127這256個(gè)狀態(tài)的Integer,如果使用Integer.valueOf(int i),傳入的int范圍正好在此內(nèi),就返回靜態(tài)實(shí)例。

    hashCode()方法很奇怪,兩種Boolean的hash code分別是1231和1237。估計(jì)寫(xiě)B(tài)oolean.java的人對(duì)這兩個(gè)數(shù)字有特別偏好:

    public int hashCode() {
        return value ? 1231 : 1237;
    }

    equals()方法也很簡(jiǎn)單,只有Boolean類(lèi)型的Object并且value相等才返true:

    public boolean equals(Object obj) {
        if (obj instanceof Boolean) {
            return value == ((Boolean)obj).booleanValue();
        }
        return false;
    }

    順便提一句:很多人寫(xiě)equals()總是在第一行寫(xiě):
       if (obj==null) return false;
    其實(shí)完全沒(méi)有必要,因?yàn)槿绻鹢bj==null,下一行的
        if (obj instanceof Type)
    就肯定返回false,因?yàn)?null instanceof AnyType) = false。
    詳細(xì)內(nèi)容請(qǐng)參考《Effective Java》第7條:Obey the general contract when overriding equals。

    其他的方法如toString()就更簡(jiǎn)單了,只要稍微熟悉java的程序員相信都能寫(xiě)出來(lái),我就不多說(shuō)了。

    總結(jié)

    1.如果一個(gè)類(lèi)只有有限的幾種狀態(tài),考慮用幾個(gè)final的靜態(tài)變量來(lái)表示不同狀態(tài)的實(shí)例。
    例如編寫(xiě)一個(gè)Weekday類(lèi),狀態(tài)只有7個(gè),就不要讓用戶(hù)寫(xiě)new Weekday(1),直接提供Weekday.MONDAY即可。

    2.要防止用戶(hù)使用new生成實(shí)例,就取消public構(gòu)造函數(shù),用戶(hù)要獲得靜態(tài)實(shí)例的引用有兩個(gè)方法:如果申明public static var就可以直接訪問(wèn),比如Boolean.TRUE,
    第二個(gè)方法是通過(guò)靜態(tài)工廠方法:Boolean.valueOf(?)

    3.如果不提供public構(gòu)造函數(shù),讓用戶(hù)只能通過(guò)上面的方法獲得靜態(tài)變量的引用,還可以大大簡(jiǎn)化equals()方法:
        public boolean equals(Object obj) {
            return this==obj;
        }
    可以直接用==比較引用,絕對(duì)沒(méi)有問(wèn)題,而且效率最高。

    4.為什么JDK的Boolean沒(méi)有實(shí)現(xiàn)上面第3點(diǎn)?因?yàn)槟莾蓚€(gè)static變量TRUE和FALSE是在jdk 1.2以后才有的,由于前面的版本已經(jīng)把構(gòu)造函數(shù)申明為public,所以為了保持客戶(hù)端代碼能夠不修改也在后面的版本中運(yùn)行,只好繼續(xù)提供public構(gòu)造函數(shù)。

    posted on 2005-12-02 10:35 Xuefeng's Weblog 閱讀(388) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java Basic


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 深夜a级毛片免费无码| 亚洲一区二区三区写真| 国产在线观看无码免费视频| 国产一区二区三区免费看| 亚洲AV成人精品一区二区三区| 免费人成视频在线| 亚洲国产区男人本色| 青青青青青青久久久免费观看| 亚洲精品无码av片| 免费在线观看黄网| 9久热精品免费观看视频| 亚洲一区二区三区影院| 无码人妻久久一区二区三区免费 | 亚洲av日韩av欧v在线天堂| 在线观看亚洲专区| 亚洲一区日韩高清中文字幕亚洲| 一级女性全黄生活片免费看| 久久久青草青青亚洲国产免观 | 亚洲乱码一二三四五六区| 无码中文在线二区免费| 亚洲男人的天堂网站| 亚洲人成国产精品无码| 免费无码又爽又刺激网站直播| 综合自拍亚洲综合图不卡区| 成人无遮挡毛片免费看| 黄网站在线播放视频免费观看 | 久久青草免费91线频观看站街| 亚洲无人区视频大全| 永久中文字幕免费视频网站| 人成电影网在线观看免费| 久久亚洲精品中文字幕无码 | 久久www免费人成精品香蕉| 亚洲免费精彩视频在线观看| 国产精品久久永久免费| 无码免费又爽又高潮喷水的视频 | 亚洲欧洲免费无码| 亚洲中文字幕无码日韩| 日韩在线免费视频| 国产99久久久国产精免费| 亚洲成人动漫在线观看| 久久影院亚洲一区|