zoukankan      html  css  js  c++  java
  • 不可变类(一):

    1、不可变类(immutable):创建该类实例后,该类的实例变量是不可改变的

    2、Java提供的8个包装类和java.lang.String类都是不可变类,当创建他们的实例后,其实例的实例变量都是不可改变的。

    3、创建自定义不可变类的原则:

      .1、使用private和final修饰该类的成员变量

      .2、提供带参数的构造器,用来根据传入参数初始化类里的成员变量

      .3、仅为该类的成员变量提供getter方法,不要提供setter方法,因为普通方法不能修改final修饰的成员变量

      .4、如果有必要,重写Object类的equals()方法,hashCode()方法,equals()方法根据关键成员变量来作为两个对象相等的标准,

        还应该保证,用equals()方法判断相等的对象的hashcode()也相等

    如下代码示例:

    class Address{
    	//-使用private和final修饰该类的成员变量
    	//---不可变类:一要素
    	private final String detail;
    	private final String postCode;
    
    	public Address(){
    		//-赋值 就不可再变
    		this.detail="";
    		this.postCode="";
    	}
    
    	//-提供带参数的构造器,用来根据传入参数初始化类里的成员变量 
    	//---不可变类:二要素
    	public Address(String detail,String postCode){
    		//-赋值 就不可再变
    		this.detail=detail;
    		this.postCode=postCode;
    	}
    
    	//-仅为该类的成员变量提供getter方法,不要提供setter方法,因为普通方法不能修改final修饰的成员变量
    	//---不可变类:三要素
    	public String getDetail(){
    		return this.detail;
    	}
    	
    	public String getPostCode(){
    		return this.postCode;
    	}
    
    	//-如果有必要,重写Object类的equals()方法,hashCode()方法
    	//-equals()方法根据关键成员变量来作为两个对象相等的标准
    	//-还应该保证,用equals()方法判断相等的对象的hashcode()也相等
    	//---不可变类:四要素
    	public boolean equals(Object obj){
    		if(this==obj){
    			return true;
    		}
    		if(obj!=null&&obj.getClass()==Address.class){
    			Address add = (Address)obj;
    			if(this.getDetail().equals(add.getDetail())&&this.getPostCode().equals(add.getPostCode())){
    				return true;
    			}
    		}
    		
    		return false;
    	}
    	
    	//-重写 hashCode() 方法
    	public int hashCode(){
    		return this.detail.hashCode()+this.postCode.hashCode()*31;
    	}
    }
    
    public class AddressEquals{
    	public static void main(String[] args){
    		Address add1 = new Address("北京市","100010");
    		Address add2 = new Address("北京市","100010");
    
    		Address add3 = new Address();
    		Address add4 = new Address("北京市","100011");
    
    		System.out.println(add1.equals(add2));
    		System.out.println(add1==add2);
    		System.out.println(add1.equals(add3));
    		System.out.println(add1.hashCode());
    		System.out.println(add2.hashCode());
    		System.out.println(add3.hashCode());
    		System.out.println(add1.hashCode()==add2.hashCode());
    	}
    }
    

     运行结果如下:

  • 相关阅读:
    Linq组合查询与分页组合查询结合
    jQuery常见用法
    验证码制作
    文件上传,图片加水印
    【2017-06-06】Ajax完整结构、三级联动的制作
    【2017-06-05】Jquery.ajax
    JQuery选择器,动画,事件和DOM操作
    Linq高级查询,分页查询及查询分页结合
    Linq基础+Lambda表达式对数据库的增删改及简单查询
    WebForm文件上传
  • 原文地址:https://www.cnblogs.com/baby-zhude/p/8093792.html
Copyright © 2011-2022 走看看