Java學(xué)習(xí)筆記2

Singleton / 不可變類 / 緩存不可變類 的實(shí)現(xiàn)

Singleton(單例類)

單例類用的地方很多,如果一個(gè)類始終只能創(chuàng)建一個(gè)實(shí)例,則這個(gè)類被稱為單例類。

以下程序是創(chuàng)建一個(gè)單例類:

public class SingletonTest {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2);
        s1.setName("Singleton1");
        System.out.println("s1 = " + s1.getName());
        System.out.println("s2 = " + s2.getName());
        s2.setName("Singleton2");
        System.out.println("s1 = " + s1.getName());
        System.out.println("s2 = " + s2.getName());
    }
}
class Singleton {
    private String name;
    private static Singleton singleton = new Singleton("default");
    private Singleton(String name) {
        this.name = name;
    }
    public static Singleton getInstance() {
        return singleton;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
}

不可變類

不可變類就是在創(chuàng)建該類的實(shí)例后不能更改該類的屬性。Java提供的8個(gè)包裝類和java.lang.String都是不可變類。

創(chuàng)建不可變類的幾個(gè)規(guī)則:

  • 使用private 和 final 修飾符修飾屬性;
  • 提供帶參數(shù)的構(gòu)建起,用于初始化屬性值;
  • 只提供getter方法;
  • 重寫hashCode 和 equlas方法;
/**
 * Person 類是一個(gè)不可變類
 * @author wangmin
 *
 */
public class Person {
    private final String name;
    private final int age;
    public Person() {
        this.name = "";
        this.age = 0;
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return this.name;
    }
    public int getAge() {
        return this.age;
    }
    public boolean equlas (Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj.getClass() == this.getClass()) {
            Person p = (Person)obj;
            if (this.getName().equals(p.getName()) && this.age == p.getAge()) {
                return true;
            }
        }
        return false;
    }
    public int hasCode() {
        return name.hashCode() + age;
    }
}

緩存不可變類

如果程序經(jīng)常需要使用相同的不可變類實(shí)例,則應(yīng)該考慮緩存這種不可變類。下面是簡單的使用數(shù)組的方式實(shí)現(xiàn)一個(gè)不可變類。

/**
 * 使用數(shù)組的方式來緩解Person
 * 1. 定義數(shù)組大小,并且使用private static 修飾
 * 2. 定義valueOf方法獲取對(duì)象,但是其中存在以下幾種情況:
 *  2.1 循環(huán)遍歷整個(gè)緩存數(shù)組的大小,然后比較,如果已經(jīng)被緩存則直接取出。(注意數(shù)組元素可能為null)
 *  2.2 由2.1的結(jié)果可知,如果數(shù)組中沒有則新創(chuàng)建。
 *  2.3 首次判斷pos是否已滿,如果已滿則將新的對(duì)象創(chuàng)建到數(shù)組0的位置,并且將pos設(shè)置為0,并返回。
 *  2.4 如果沒有滿則根據(jù)pos的位置創(chuàng)建,并返回。
 * @author wangmin
 *
 */
public class CachePerson {
    private static int MAX_SIZE = 10;
    private static CachePerson[] cp = new CachePerson[MAX_SIZE];
    private String name;
    private static int pos = 0;
    
    public CachePerson() {
        
    }
    public CachePerson(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    public static CachePerson valueOf(String name) {
        for (int i = 0; i < MAX_SIZE; i++) {
            if (cp[i] != null && cp[i].getName().equals(name)) {
                return cp[i];
            }
        }
        if (pos == MAX_SIZE) {
            cp[0] = new CachePerson(name);
            pos = 1;
        } else {
            cp[pos++] = new CachePerson(name);
        }
        return cp[pos-1];
    }
    public boolean equlas (Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj.getClass() == this.getClass()) {
            CachePerson cp = (CachePerson)obj;
            if (cp.getName().equals(this.getName())) {
                return true;
            }
        }
        return false;
    }
    public int hasCode() {
        return name.hashCode();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,697評(píng)論 18 399
  • JAVA學(xué)習(xí)筆記作者:劉先寶寫作日期:2016.2.23更新日期:2016.2.25版本號(hào):2.0大綱 1.說說J...
    9ef822571b70閱讀 465評(píng)論 2 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,555評(píng)論 19 139
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,011評(píng)論 0 11
  • 基本概念 一個(gè)Java程序可以認(rèn)為是一系列對(duì)象的集合,而這些對(duì)象通過調(diào)用彼此的方法來協(xié)同工作。 對(duì)象:對(duì)象是類的一...
    追風(fēng)劍007閱讀 280評(píng)論 0 0

友情鏈接更多精彩內(nèi)容