软件构造课程笔记——对象等价性

等价性设计原则

可变类

equals() 比较引用,同==运算符。即比较行为等价性而非观察等价性。
hashCode() 将引用地址映射到整型。

不当覆写equals(),hashCode()。

不可边类

equals() 比较抽象值。即比较行为等价性(对不可变类来说,观察等价即行为等价)。
hashCode() 将抽象值映射的整型。

应当覆写equals(),hashCode()。

equals()规范

  1. 自反性 x.equals(x)==true。
  2. 对称性 y.equals(x)==true <—> x.equals(y)==true
  3. 传递性 x.equals(y)==true,y.equals(z)==true —> x.equals(z)==true
  4. 一致性 若xy引用的对象为变化,则反复调用x.equals(y)的返回值当恒定
  5. 非空性 x.equals(null) == false
equals()示例
	@Override
	public boolean equals(Object otherObject)
	{
		if(this == otherObject)
			return true;
		//instanceof会检查null;假定所有子类有统一的等价性语义,否则,应手动检查null,并用getClass()检查类型
		if(! (otherObject instanceof ImmutableClass) )	
			return false;
		ImmutableClass other = (ImmutableClass) otherObject;
		
		return primitiveFiled1 == other.primitiveFiled1
				&& primitiveFiled2 == other.primitiveFiled2
				&& Objects.equals(objectFiled1, other.objectFiled1)
				&& Objects.equals(objectFiled2, other.objectFiled2);
	}

hashCode()规范

  1. 等价对象必须有相同hash值
  2. 不等对象应尽可能避免相同hash值
  3. hash值应当恒定(不可变对象的抽象值恒定,其hash自然恒定;可变对象用地址hash,固也恒定)

覆写equals()时,也应覆写hashCode()
否则,使用基于hash的数据结构时会出现混乱的行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值