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

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

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

    一葉笑天
    雄關(guān)漫道真如鐵, 而今邁步從頭越。 從頭越, 蒼山如海, 殘陽(yáng)如血。
    posts - 73,comments - 7,trackbacks - 0
    如果一個(gè)對(duì)象是immutable的話,它總是可以被重用的。例如:
    String s = new String("stringette"); // DON'T DO THIS!
    這條語(yǔ)句每次執(zhí)行時(shí)都會(huì)創(chuàng)建新的String。增強(qiáng)的版本是:
    String s = "stringette";
    這種形式使用單一的String實(shí)例,而不是每次都會(huì)創(chuàng)建新的String。
    使用static factory method可以避免創(chuàng)建不需要的對(duì)象。例如Boolean.valueOf(String)比Boolean(String)更具有優(yōu)勢(shì)。構(gòu)造函數(shù)每次都會(huì)創(chuàng)建新實(shí)例。而靜態(tài)工廠方不需要這樣做。
    舉一個(gè)簡(jiǎn)單的例子:
    這個(gè)類包含有Date對(duì)象,這個(gè)值一旦被計(jì)算出來(lái)就從不改變。這個(gè)類構(gòu)造一個(gè)person,有一個(gè)isBabyBoomer方法,來(lái)判斷這個(gè)person是否是“baby
    boomer,”  是否出生在1946年到1964年。
     1public class Person {
     2    private final Date birthDate;
     3
     4    // Other fields, methods, and constructor omitted
     5    // DON'T DO THIS!
     6    public boolean isBabyBoomer() {
     7        // Unnecessary allocation of expensive object
     8        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
     9        gmtCal.set(1946, Calendar.JANUARY, 1000);
    10        Date boomStart = gmtCal.getTime();
    11        gmtCal.set(1965, Calendar.JANUARY, 1000);
    12        Date boomEnd = gmtCal.getTime();
    13        return birthDate.compareTo(boomStart) >= 0
    14                && birthDate.compareTo(boomEnd) < 0;
    15    }

    16}
    isBabyBoomer方法不需要每次創(chuàng)建一個(gè)Calendar,TimeZone和兩個(gè)Date實(shí)例。為了避免不必要的創(chuàng)建,可以使用static初始化:
     1class Person {
     2    private final Date birthDate;
     3    // Other fields, methods, and constructor omitted
     4    /**
     5     * The starting and ending dates of the baby boom.
     6     */

     7    private static final Date BOOM_START;
     8    private static final Date BOOM_END;
     9    static {
    10        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    11        gmtCal.set(1946, Calendar.JANUARY, 1000);
    12        BOOM_START = gmtCal.getTime();
    13        gmtCal.set(1965, Calendar.JANUARY, 1000);
    14        BOOM_END = gmtCal.getTime();
    15    }

    16
    17    public boolean isBabyBoomer() {
    18        return birthDate.compareTo(BOOM_START) >= 0
    19                && birthDate.compareTo(BOOM_END) < 0;
    20    }

    21}
          增強(qiáng)的版本中只創(chuàng)建Calendar,TimeZone和兩個(gè)Date一次。當(dāng)這個(gè)方法頻繁調(diào)用的時(shí)候性能會(huì)得到很大的提高。Calendar創(chuàng)建是開(kāi)銷是很大的。
          如果isBabyBoomer從未調(diào)用,BOOM_START和BOOM_END 也是不需要初始化的。可以使用lazily initializing來(lái)加載它們。但是這不是推薦的。經(jīng)常使用lazy initialization會(huì)使實(shí)現(xiàn)變得復(fù)雜,未必優(yōu)于已經(jīng)取得的性能。
        在上面的例子中,很顯然是由于對(duì)象在初始化后不再修改才重用。其他場(chǎng)合下未必這么顯然。例如adapter,也稱為views。adaper代表一個(gè)后臺(tái)對(duì)象,提供一個(gè)可供選擇的接口給后臺(tái)對(duì)象。由于adapter沒(méi)有狀態(tài),因此不需要?jiǎng)?chuàng)建多個(gè)實(shí)例。
       例如Map接口的keySet方法返回一個(gè)Map對(duì)象的Set視圖,包含所有map中的key值。顯然在給定的Map上每個(gè)調(diào)用keySet都會(huì)創(chuàng)建一個(gè)Set實(shí)例,但是每個(gè)調(diào)用都會(huì)返回相同的Set實(shí)例。雖然返回的Set是可變的,但是所有的對(duì)象都是一致的,當(dāng)其中一個(gè)變化了,所有的都要改變。這是因?yàn)樵谒鼈兒竺媸窍嗤腗ap實(shí)例。創(chuàng)建多個(gè)keySet視圖對(duì)象無(wú)害但無(wú)意義。
      在1.5中autoboxing可以創(chuàng)建無(wú)用的對(duì)象。容許程序員混合基本類型和包裝類。自動(dòng)boxing和unboxing操作。看下面的例子:計(jì)算所有正int的和。必須使用long才能保存所有正int的和。
    1// Hideously slow program! Can you spot the object creation?
    2public static void main(String[] args) {
    3  Long sum = 0L;
    4  for (long i = 0; i < Integer.MAX_VALUE; i++{
    5    sum += i;
    6  }

    7  System.out.println(sum);
    8}
    隨著程序可以得到正確結(jié)果,但是計(jì)算會(huì)慢。主要由于一個(gè)字符的錯(cuò)誤。變量sum被聲明為L(zhǎng)ong,而不是long,這意味著程序?qū)⒁獎(jiǎng)?chuàng)建2(31)個(gè)無(wú)用的Long實(shí)例。這個(gè)教訓(xùn)是:盡量使用基本類型boxed到基本類型,當(dāng)心無(wú)意識(shí)的autoboxing。
       通過(guò)創(chuàng)建對(duì)象池來(lái)避免對(duì)象創(chuàng)建不是一個(gè)好主意,除非池中的數(shù)據(jù)極其重量級(jí)。例如數(shù)據(jù)庫(kù)連接。創(chuàng)建連接的花銷很高,最好重用這個(gè)對(duì)象。


    posted on 2008-06-19 21:47 一葉笑天 閱讀(210) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA技術(shù)
    主站蜘蛛池模板: 59pao成国产成视频永久免费| A国产一区二区免费入口| 亚洲午夜免费视频| 免费人成网上在线观看| 麻豆国产入口在线观看免费| 亚洲中久无码不卡永久在线观看| 国产尤物在线视精品在亚洲| 日本久久久免费高清| 亚洲福利视频导航| 久久午夜羞羞影院免费观看| 亚洲an天堂an在线观看| 伊人久久免费视频| 亚洲人成日本在线观看| 野花高清在线观看免费3中文| 国产日韩亚洲大尺度高清| 亚洲精品无码专区| 免费久久精品国产片香蕉| 男男gvh肉在线观看免费| 久久亚洲精品无码播放| 免费一级毛片无毒不卡| 亚洲婷婷综合色高清在线| 女人毛片a级大学毛片免费| 激情小说亚洲图片| 亚洲无av在线中文字幕| 杨幂最新免费特级毛片| 国产成人综合亚洲AV第一页| 国产精品免费看久久久 | 无码国产精品一区二区免费| 亚洲AV无码一区二区三区牛牛| 日日夜夜精品免费视频| 中文字幕看片在线a免费| 亚洲无成人网77777| 国产一级淫片免费播放电影| 国产中文字幕在线免费观看| 亚洲成aⅴ人片在线观| 免费一看一级毛片人| 免费污视频在线观看| 亚洲日本VA中文字幕久久道具| 国产成人亚洲综合无码| 成人免费福利视频| 亚洲va久久久噜噜噜久久狠狠|