首页 > 为什么有些类的方法开始先判断getId() == null?

为什么有些类的方法开始先判断getId() == null?

  1. mybatis3中PerpetualCache中的equals和hashCode方法在第一行先判断getId() == null, 有点不能理解, 为什么要这个判断, 不是不可能为null吗。

  2. 代码如下:

  @Override
  public boolean equals(Object o) {
    if (getId() == null) {
      throw new CacheException("Cache instances require an ID.");
    }
    if (this == o) {
      return true;
    }
    if (!(o instanceof Cache)) {
      return false;
    }

    Cache otherCache = (Cache) o;
    return getId().equals(otherCache.getId());
  }

  @Override
  public int hashCode() {
    if (getId() == null) {
      throw new CacheException("Cache instances require an ID.");
    }
    return getId().hashCode();
  }

当协作工作时,你是无法判断调用方的,我们口头的约定是很容易被某个人轻易打破的,为了避免有人去做这样的事,参数检查是很有意义也很有必要的行为,这样也便于问题的排查


id决定缓存的唯一性,hashCode,equals方法的判断唯一性参考


假如getId()==null呢,你把原因和结果搞反了,是因为不允许为空,所以有了if判断,如果为空,抛出一个自定义异常,告诉你不能为null


这个是DBC的策略实现
DBC分三种:
1.Post-conditions 后置条件postcondition 表示调用一个方法一定会得到的结果。类似断言Assertion,如果语言不支持断言,那么我们就必须自己写断言,也就是测试驱动了。

2.Pre-conditions 前置条件precondition ,预先保证后置条件必须满足前置条件。
前置条件必须满足,后置条件必须实现,通过契约的前置和后置条件的结合,就不会出现有隐藏的功能obligations,这样,事情清清楚楚地被摆出来。这样设计才能落实为代码,保证正常的对象调用。

3.类不变量class invariant 表示对象状态的断言,执行完任何操作后都都应该被满足,不变量还是对聚合体进行完整性严格定义。


这是个很好的编程习惯


底层框架的方法无法知道应用层的所有使用情况,极可能有些人没有遵守规则,为了保证程序的正确性,做一些防卫性的代码,是有必要的。


不错,学习了

【热门文章】
【热门文章】