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;  
    }  
  
}
相关文章
相关标签/搜索