java - 为什么有些类的方法开始先判断getId() == null?
黄舟
黄舟 2017-04-18 09:38:01
0
7
468
  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();
  }
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(7)
黄舟

底層框架的方法無法知道應用層的所有使用情況,極可能有些人沒有遵守規則,為了保證程序的正確性,做一些防衛性的代碼,是有必要的。

洪涛

id決定快取的唯一性,hashCode,equals方法的判斷唯一性參考

巴扎黑

這是個很好的程式設計習慣

左手右手慢动作

當協作工作時,你是無法判斷調用方的,我們口頭的約定是很容易被某個人輕易打破的,為了避免有人去做這樣的事,參數檢查是很有意義也很有必要的行為,這樣也方便問題的檢驗

左手右手慢动作

不錯,學習了

左手右手慢动作

假如getId()==null呢,你把原因和結果搞反了,是因為不允許為空,所以有了if判斷,如果為空,拋出一個自定義異常,告訴你不能為null

左手右手慢动作

這個是DBC的策略實作
DBC分成三種:
1.Post-conditions 後置條件postcondition 表示呼叫一個方法一定會得到的結果。類似斷言Assertion,如果語言不支援斷言,那麼我們就必須自己寫斷言,也就是測試驅動了。

2.Pre-conditions 前置條件precondition ,預先確保後置條件必須滿足前置條件。
前置條件必須滿足,後置條件必須實現,透過契約的前置和後置條件的結合,就不會出現有隱藏的功能obligations,這樣,事情清清楚楚地被擺出來。這樣設計才能落實為程式碼,確保正常的物件呼叫。

3.類別不變量class invariant 表示物件狀態的斷言,執行完任何操作後都應該被滿足,不變量還是對聚合體進行完整性嚴格定義。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!