最近编码的过程中,使用了对象本地内存缓存,缓存用了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. 黑苹果引导工具 Clover 配置详解及Clover Configurator使用

    黑苹果引导工具 Clover 配置详解及Clover Configurator使用  2017-03-11 14:01:40 by SemiconductorKING 转自:@三个表哥   简介: 可 ...

  2. 使用promise手动封装ajax函数

    最近在做一个单页应用,node和浏览器仅通过json传输数据,因为是只有自己用等于是锻炼一下自己,所以也不用考虑seo的问题,node端我已经写好了,但是浏览器端想要用ajax原生太麻烦,用封装的函数 ...

  3. koa中间件系统原理及koa+orm2实践。

    koa是由 Express 原班人马打造的新的web框架.套用其官方的说法:Koa 应用是一个包含一系列中间件 generator 函数的对象. 这些中间件函数基于 request 请求以一个类似于栈 ...

  4. 在线音乐播放器-----酷狗音乐api接口抓取

    首先身为一个在线音乐播放器,需要前端和数据库的搭配使用. 在数据库方面,我们没有办法制作,首先是版权问题,再加上数据量.所以我们需要借用其他网络播放器的数据库. 但是这些在线播放器,如百度,酷狗,酷我 ...

  5. Untiy文档总结(1)-Profiling

    这段时间上班了,不是什么大公司,虽说很闲但是不能断了学习,就开始看优化有关的文档,虽说自己英语渣的要死,但也要读下去,逼着自己翻译完了,里面有抄Unity圣典的,但自己是看Unity5.5文档写的,只 ...

  6. 微信JS图片上传与下载功能--微信JS系列文章(三)

    概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...

  7. Markdowm入门

    今天介绍一种非常好用的小巧性标记语言--Markdown,熟悉它的语法规则,这将会节省你很多编辑文本文档格式的时间,提高你的工作效率和学习效率. 一.什么是Markdown Markdown是一种可以 ...

  8. 【Yii系列】Yii2.0基础框架

    缘起 因为一个月的短暂停留,我在给朋友搞事情,所以Yii系列的文章耽搁了很长时间,现在又重拾当时的知识,给大伙好好撸下这一系列的博客 提起Yii,虽然是国外的开发者搞的,但是它的作者是华人,这才是让我 ...

  9. 一步步教你使用rem适配不同屏幕的移动设备

    1.先说说几个前端常用的几个单位的概论: 1.px (pixel,像素):是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Per Inch ...

  10. 学习Jammendo代码的心路历程(二)ViewFlipper数据的填充

    打开Jammendo进入到首页之后,会看到这样一个界面.可以看到下左效果,我们可以看到,他是上部分的ViewFlipper模块和下半部分的listview模块构成的,今天就简单的说一下Jammendo ...