Java不可變對象

定義:一個對象的狀態(對象的屬性,並不是對象在JVM中的生命週期中的狀態)在對象被建立以後就再也不變化。java

實現方式:緩存

  • 將類聲明爲final,因此它不能被繼承;
  • 將全部的成員聲明爲私有的,這樣就不容許直接訪問這些成員;
  • 對變量不要提供setter方法;
  • 將全部可變的成員聲明爲final,這樣只能對它們賦值一次;
  • 經過構造器初始化全部成員,進行深拷貝(deep copy);
  • 在getter方法中,不要直接返回對象自己,而是克隆對象,並返回對象的拷貝
  • 不添加默認構造函數,防止建立一個無用的不可變對象

用途:安全

  • 由於其不可變特性保證其是線程安全的
  • 當成緩存類使用
package jv.maven_java.interview;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

public class IVImmutable {

	@Test
	public void test() {
		Map<String , Object> m = new HashMap<String , Object>();
		m.put("GG", "gg");
		m.put("AA", "aa");
		Immutable it = new Immutable(1001,"Immutable",m);
		Map tM= it.getMap();
		/**
		 * 由於兩個Map填充的值是如出一轍的,全部HashCode計算出來同樣,因此使用equals方法比較返回是true
		 * 而兩個是不一樣的引用,因此使用==比較時返回false
		 */
		System.out.println(m.hashCode());
		System.out.println(tM.hashCode());
		
		System.out.println(tM == m);
		System.out.println(tM.equals(m));
		
	}
}

/**
 * final修飾類,該類不能被繼承
 * @author Administrator
 *
 */
final class Immutable {  
    private final int id;  
    private final String name;  
    private final HashMap<String,Object> map;  
   
    public int getId() {  
        return id;  
    }  
   
    public String getName() {  
        return name;  
    }  
   
    /** 
     * 可變對象的訪問方法 
     */  
    public HashMap<String,Object> getMap() {  
        return (HashMap<String,Object>) map.clone();  
    }  
   
    /** 
     * 實現深拷貝的構造器*/  
    public Immutable(int i, String n, Map<String,Object> hm){
    	this.id=i;  
        this.name=n;  
        HashMap<String,Object> tempMap=new HashMap<String,Object>();  
        tempMap.putAll(hm);
        
        this.map = tempMap;  
    }  
  
}
相關文章
相關標籤/搜索