Java的不可變類(緩存實(shí)例)

不可變類

不可變類的意思是在創(chuàng)建該類的實(shí)例后熔恢,該實(shí)例的實(shí)例變量是不可以改變的。Java提java.lang.String類都是不可變類健民,當(dāng)創(chuàng)建它們的實(shí)例后柳恐,實(shí)例的實(shí)例變量也是不可改變的。

如:

Double d = new Double(2.2);
String str = new String("cuzz");

如果需要創(chuàng)建一個(gè)自定義的不可變類狸捕,應(yīng)具備以下幾個(gè)規(guī)則

  • 使用privatefinal修飾符來修飾該類的成員變量
  • 提供帶參數(shù)的構(gòu)造器喷鸽,用于根據(jù)傳入?yún)?shù)來初始化類里的成員變量
  • 提供getter方法,不需要setter方法

下面定義一個(gè)不可變Adress類灸拍,程序把Address類的detail和postCode成員變量都使用private隱藏起來做祝,并使用final修飾這兩個(gè)成員變量,不允許其他方法修改這兩個(gè)成員變量的值

public class Address {
    private final String detail;
    private final String postCode;
    // 在構(gòu)造器里初始化兩個(gè)實(shí)例變量
    public Address() {
        this.detail = "";
        this.postCode = "";
    }
    
    public Address(String detail, String postCode) {
        this.detail = detail;
        this.postCode = postCode;
    }
    
    // 僅為兩個(gè)實(shí)例變量提供getter方法
    public String getDetail() {
        return this.detail;
    }
    
    public String getPostCode() {
        return this.postCode;
    }
    
    // 重新equeal方法
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        
        if (obj != null && obj.getClass() == Address.class) {
            Address address = (Address) obj;
            // 當(dāng)detail和postCode同時(shí)相等時(shí)
            if (address.detail == detail && address.postCode == postCode) {
                return true;
            }
        }
        return false;
    }
    
    public int hashCode() {
        return detail.hashCode() + postCode.hashCode() * 31;
    }
}

緩存實(shí)例的不可變類

不可變類的實(shí)例狀態(tài)不可以改變鸡岗,可以很方便的被多個(gè)對象所共享混槐,如果程序經(jīng)常需要使用相同的不可變實(shí)例,可以考慮緩存這種不可變的實(shí)例轩性。

public class CacheImmutable {
    private static int MAX_SIZE = 10;
    // 使用數(shù)組來緩存已有的實(shí)例
    private static CacheImmutable[] cache = new CacheImmutable[MAX_SIZE];
    // 記錄緩存實(shí)例在緩存的位置   cache[pos-1]是最新的實(shí)例
    private static int pos = 0;
    private final String name;
    
    private CacheImmutable(String name) {
        this.name = name;
    }
    
    private String getName() {
        return name;
    }
    
    public static CacheImmutable valueOf(String name) {
        // 遍歷所有的對象
        for (int i = 0; i < MAX_SIZE; i++) {
            // 如果已有相同的實(shí)例  則返回該緩存的實(shí)例
            if (cache[i] != null && cache[i].getName().equals(name)) {
                return cache[i];
            }
        }
        // 如果緩存池已滿
        if (pos == MAX_SIZE) {
            // 把緩存的第一個(gè)對象覆蓋  把剛剛生成的對象放在緩存池最開始
            pos = 0;
            cache[pos++] = new CacheImmutable(name);
        }else {
            cache[pos++] = new CacheImmutable(name);
        }
        return cache[pos-1];
        

    }
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj.getClass() == CacheImmutable.class) {
            CacheImmutable ci = (CacheImmutable) obj;
            return name.equals(ci.getName());
        }
        return false;
    }
}

測試類:

public class CacheImmutableTest {
    public static void main(String[] args) {
        CacheImmutable c1 = CacheImmutable.valueOf("cuzz");
        CacheImmutable c2 = CacheImmutable.valueOf("cuzz");
        System.out.println(c1 == c2 );   // 輸出true
    }
}

與Java提供的java.lang.Integer類采用的相同的策略

public class IntegerCacheTest {
    public static void main(String[] args) {
        // 生成新的Integer對象
        Integer in1 = new Integer(6);
        // 生成新的Integer對象  并緩存該對象
        Integer in2 = Integer.valueOf(6);
        // 直接從緩存中取出Integer對象
        Integer in3 = Integer.valueOf(6);
        System.out.println(in1 == in2);  // false
        System.out.println(in2 == in3);  // true
        // 由于Integer只緩存-128~127之間
        Integer in4 = Integer.valueOf(200);
        Integer in5 = Integer.valueOf(200);
        System.out.println(in4 == in5);   // false
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纵隔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炮姨,更是在濱河造成了極大的恐慌捌刮,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舒岸,死亡現(xiàn)場離奇詭異绅作,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蛾派,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門俄认,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洪乍,你說我怎么就攤上這事眯杏。” “怎么了壳澳?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵岂贩,是天一觀的道長。 經(jīng)常有香客問我巷波,道長萎津,這世上最難降的妖魔是什么卸伞? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮锉屈,結(jié)果婚禮上荤傲,老公的妹妹穿的比我還像新娘。我一直安慰自己颈渊,他們只是感情好遂黍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俊嗽,像睡著了一般妓湘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乌询,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天榜贴,我揣著相機(jī)與錄音,去河邊找鬼妹田。 笑死唬党,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鬼佣。 我是一名探鬼主播驶拱,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晶衷!你這毒婦竟也來了蓝纲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晌纫,失蹤者是張志新(化名)和其女友劉穎税迷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锹漱,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡箭养,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哥牍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毕泌。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嗅辣,靈堂內(nèi)的尸體忽然破棺而出撼泛,到底是詐尸還是另有隱情,我是刑警寧澤澡谭,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布愿题,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抠忘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一外永、第九天 我趴在偏房一處隱蔽的房頂上張望崎脉。 院中可真熱鬧,春花似錦伯顶、人聲如沸囚灼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灶体。三九已至,卻和暖如春掐暮,著一層夾襖步出監(jiān)牢的瞬間蝎抽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工路克, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留樟结,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓精算,卻偏偏與公主長得像瓢宦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子灰羽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法驮履,類相關(guān)的語法,內(nèi)部類的語法廉嚼,繼承相關(guān)的語法玫镐,異常的語法,線程的語...
    子非魚_t_閱讀 31,644評論 18 399
  • 一怠噪、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)...
    子非魚_t_閱讀 4,195評論 1 44
  • 一:java概述:1摘悴,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境舰绘,java的開發(fā)工...
    ZaneInTheSun閱讀 2,654評論 0 11
  • 在我參加工作若干年之后蹂喻,始終覺得人這一生,運(yùn)動和學(xué)習(xí)將是永恒的伴隨捂寿,運(yùn)動使人健康口四,學(xué)習(xí)催人進(jìn)步,且樂趣多多秦陋,積極向...
    漫步海灘521閱讀 406評論 0 0
  • 2018年1月12日 星期五 晴 昨天和熊老師討論了孩子讀書的問題蔓彩,熊老師家寶貝比我家二寶大幾個(gè)月,現(xiàn)在每天自己看...
    Viki和兩寶共成長閱讀 167評論 0 1