mybatis3中PerpetualCache中的equals和hashCode方法在第一行先判断getId() == null, 有点不能理解, 为什么要这个判断, 不是不可能为null吗。
代码如下:
@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 の場合は、原因と結果が逆になります。null であることは許可されていないため、if 判定が行われます。null の場合は、そのことを示すカスタム例外がスローされます。
を null にすることはできません。これは DBC のストラテジ実装です
DBC には 3 つのタイプがあります:
1.事後条件 事後条件は、メソッドの呼び出しによって必ず得られる結果を表します。アサーションと同様に、言語がアサーションをサポートしていない場合は、テスト駆動のアサーションを自分で作成する必要があります。
2.事前条件 precondition。事後条件が事前条件を満たす必要があることを事前に保証します。
契約の前提条件と事後条件の組み合わせによって、前提条件が満たされ、事後条件が実現されなければならないため、隠れた機能上の義務はなくなり、物事が明確に定められます。この方法でのみ、通常のオブジェクト呼び出しを保証する設計をコードに実装できます。
3. クラス不変式 クラス不変式は、オブジェクトの状態の表明を表します。この不変式は、集合体の整合性を厳密に定義します。