hamcrest ,一个被多个测试框架依赖的包。听说 hamcrest 的源码质量很高,特此来学习一下。建议fork原仓库,拉到本地看代码。

将源码逐一拆解,提取有借鉴意义的编码方式。
基类提供了基础方法。

@Deprecated
void _dont_implement_Matcher___instead_extend_BaseMatcher_();
BaseMatcher 中的方法依赖 Description 接口。
@Override
public void describeMismatch(Object item, Description description) {}
@Override
public String toString() {
return StringDescription.toString(this);
}
看看这个接口有什么特殊的地方。
public interface Description {
/**
* A description that consumes input but does nothing.
*/
static final Description NONE = new NullDescription();
}


可以用idea的查找依赖功能,能看到 “空实现” 使用的地方

@Override
public String toString() {
return StringDescription.toString(this);
}
public interface Matcher<T> extends SelfDescribing {}
public interface SelfDescribing {
void describeTo(Description description);
}

@Override
public String toString() {
return StringDescription.toString(this);
}
@Override
public void describeTo(Description description) {
// EG: BigDecimalCloseTo 的声明
description.appendText("a numeric value within ")
.appendValue(delta)
.appendText(" of ")
.appendValue(value);
}
笔者认为,如果存在大量的抽象类实现类,hamcrest 空对象模式可以借鉴一下。
hamcrest 的 toString 模板方法把 describe 逻辑很好的解耦到子类了,下次遇到需要追加上下文的实现可以参考这个模式(如上文的BigDecimalCloseTo )。