最近编码的过程中,使用了对象本地内存缓存,缓存用了Dictionary<string,object>, ConcurrentDictionary<string,oject>,还可以是MemoryCache(底层基于Hashtable)。使用缓存,肯定要处理数据变化缓存同步的问题。如何比较数据的变化,演进为新的内存对象数据和已有内存对象数据的相等性比较!

对象的Equals相等性比较,百度、google会有一大堆实现,几个重点的点:

1. 实现接口IEquatable<T>

https://msdn.microsoft.com/en-us/library/ms131190(v=vs.110).aspx

2.重写bool Equals(object other)方法和 int GetHashCode()方法

http://stackoverflow.com/questions/2734914/whats-the-difference-between-iequatable-and-just-overriding-object-equals

这里直接贴出来一个通用实现,分享给大家:

  /// <summary>
/// 流控事件
/// </summary>
[Serializable]
public class FlowControlEvent: IEquatable<FlowControlEvent>
{
public static readonly string Global = "Global"; /// <summary>
/// 标识
/// </summary>
public string ID { get; set; } /// <summary>
/// 流控策略名称
/// </summary>
public string StrategyName { get; set; } /// <summary>
/// 是否手工触发
/// </summary>
public bool IsManuelTrigger { get; set; } /// <summary>
/// 触发时间
/// </summary>
public DateTime TriggerTime { get; set; } /// <summary>
/// 流控策略
/// </summary>
public FlowControlStrategy Strategy { get; set; } /// <summary>
/// 持续时间,单位s
/// </summary>
public long Duration { get; set; } //是否启用
private bool isEnable = true; /// <summary>
/// 是否启用
/// </summary>
public bool IsEnable
{
get
{
return isEnable;
}
set
{
isEnable = value;
}
} /// <summary>
/// 是否使用中
/// </summary>
public bool IsUsing
{
get
{
if (IsEnable == false) return false;
if (IsManuelTrigger)
{
if (Duration == long.MaxValue)
{
return true;
}
else
{
var span = DateTime.Now - TriggerTime;
if (span.TotalSeconds > Duration)
return false;
else
return true;
}
}
else
{
return true;
}
}
} /// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; } /// <summary>
/// 创建人
/// </summary>
public string Creator { get; set; } /// <summary>
/// 最后修改时间
/// </summary>
public DateTime LastModifyTime { get; set; } /// <summary>
/// 最后修改人
/// </summary>
public string LastModifier { get; set; } /// <summary>
/// 相等性比较
/// </summary>
/// <param name="other">要比较的对象</param>
/// <returns>true 相等 false 不相等</returns>
public override bool Equals(object other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
if (other.GetType() != this.GetType()) return false; return Equals((FlowControlEvent)other);
} /// <summary>
/// 流控事件是否等于同一类型的另一个流控事件
/// </summary>
/// <param name="other">同一类型的另一个流控事件</param>
/// <returns>true 相等 false 不相等</returns>
public bool Equals(FlowControlEvent other)
{
if (other == null)
return false;
if (!string.Equals(this.ID , other.ID) || this.IsEnable != other.IsEnable || this.Duration!= other.Duration
|| !string.Equals(this.StrategyName, other.StrategyName)||this.TriggerTime!= other.TriggerTime)
return false; return true;
} /// <summary>
/// 重载GetHashCode方法
/// </summary>
/// <returns>HashCode</returns>
public override int GetHashCode()
{
unchecked
{
var result = ;
result = (result * ) ^ ID.GetHashCode();
result = (result * ) ^ IsEnable.GetHashCode();
result = (result * ) ^ Duration.GetHashCode();
result = (result * ) ^ StrategyName.GetHashCode();
result = (result * ) ^ TriggerTime.GetHashCode();
return result;
}
}
}

周国庆

2017/4/25

对象Equals相等性比较的通用实现的更多相关文章

  1. 覆盖equals方法时请遵守通用约定

    覆盖equals方法时请遵守通用约定   覆盖equals方法看起来很简单,但是有许多覆盖方式会导致错误,并且后果很严重.最容易避免这种类问题的方法就是不覆盖equals方法,在这种情况下,类的每个实 ...

  2. 关于重写对象equals方法的问题

    1.==和equals的区别 a.基本数据类型使用  == 进行值的比较 b.引用类型使用 == 进行比较时,直接比较的是对象的存储地址,即两个引用是否指向了同一个对象. c.equals方法是基类O ...

  3. java对象equals方法的重写

    根类Object中的equals方法描述: public boolean equals(Object obj)The equals method for class Object implements ...

  4. 《Effective Java》读书笔记(二)之对于所有对象都通用的方法

    第八条 在改写equals的时候请遵守通用约定 一般以下几种情况,不适宜覆盖equals方法 1.类的每个实例本质上都是唯一的,对于代表活动实体而不是值的类确实如此,例如Thread. 2.不关心类是 ...

  5. Effective Java读书笔记——第三章 对于全部对象都通用的方法

    第8条:覆盖equals时请遵守通用的约定 设计Object类的目的就是用来覆盖的,它全部的非final方法都是用来被覆盖的(equals.hashcode.clone.finalize)都有通用约定 ...

  6. 《Effective Java》第2章 对所有对象都通用的方法

    第10条:覆盖equals时,请遵守通用约定 1.使用==来比较两个对象的时候,比较的是两个对象在内存中的地址是否相同(两个引用指向的是否为同一个对象):Object中定义的equals方法也是这样比 ...

  7. Effective Java 读书笔记(二):对象通用方法

    1 重写equals方法时请遵守通用约定 (1)无需覆盖equals方法的情况 要求独一无二 不要求逻辑相等 超类已经覆盖equals方法,对其子类也适用 一个类是私有的或者是包私有(可以重写后抛出异 ...

  8. Java 如何重写对象的 equals 方法和 hashCode 方法

    前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...

  9. Java中如何判断两个对象是否相等(Java equals and ==)

    原文https://www.dutycode.com/post-140.html 如何判断两个对象相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解. 从以下几个点来理解 ...

随机推荐

  1. 道路修建 2(自创题+题解)(From NOI2011)

    道路修建这道题想来各位不陌生(传送门在此——Bzoj2435),看了此题,一开始以为是最初各个点处于分散状态,然后做了一下,直到发现标程都有点问题,才发现原题是说本来各点已经处于连接完毕的状态(phi ...

  2. springMVC中文乱码问题解决

    1:表单提交controller获得中文参数后乱码解决方案 注意:  jsp页面编码设置为UTF-8 form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果 <%@  ...

  3. Mysql 保留最新的10条数据

    Mysql每天执行计划,保留最新的10条数据,其余的删除 1.Mysql 保留最新的10条数据 sql语句: DELETE tb FROM tbname AS tb,( SELECT id FROM ...

  4. Telnet 在win7 和 xp中的使用

    telnet 默认在开启之后 监听23端口.最近在尝试使用这个服务 虽然很多机器默认是不开启telnet这个服务的 但是 万一能够碰到 也是为了自己以后能够熟练起来咯. telnet有服务器跟客户端之 ...

  5. 深入浅出数据结构C语言版(3)——递归简论

      相信学习过C语言的读者都已经接触过递归(不论是谭浩强的C程序设计还是C Primer Plus都有递归程序),本文就是对递归的基本原则进行简要介绍.首先,我们写一个基本的递归函数作为例子: int ...

  6. iwebshop两表联查

    $tb_goods = new IQuery('goods as g'); $tb_goods->join='left join miao as m on m.goods_id=g.id'; $ ...

  7. spring data jpa自定义bean字段映射

    当遇到复杂多表查询时,并且同时还需要确保查询性能,此时则需要使用自定义sql查询,然而spring data jpa对于自定义sql则需使用查询需要在对应的bean中做太多的配置映射,我尝试了一下,最 ...

  8. Myeclipse Java项目转换成Maven项目

    1.在Eclipse中Java项目转换成Maven项目可以在项目右键-->configure-->Convert Plug-in projects..  就可以.而在myeclipse中项 ...

  9. So Easy-Ntp嵌入式软件移植

    一.导语和准备工作 Ntp是一种对时的软件,对客户端来说我们只要输入ntpdate IP,如ntpdate 192.168.1.254(192.168.1.254是ntp服务器,window电脑激活自 ...

  10. php获取checkbox数组的表单数据

    提交表单的时候,对于checkbox多选框,name="field[]",此时php获取的数组为:从0开始的索引数组:如果name="field[n]" 有数字 ...