使用自定义规则来检测泛型依赖关系。
在ArchUnit中,目前确实无法直接检测泛型依赖关系。但是,我们可以使用自定义规则来实现这个目标。
具体解决方法是,定义一个自定义的Java类类型谓词(Predicate),用于过滤我们想要检测的类。该类型谓词将选择那些或者依靠了定义了泛型类型参数的类型的类。然后,通过Arch Rule API建立我们的规则:将第一个谓词应用到所有的目标类上,将第二个谓词应用到源头类上,并确保没有依赖违反了我们的规则。
代码示例如下:
JavaClasses classes =
new ClassFileImporter().importClassesIn(Package.of("com.example"));
ArchRule rule = classes().that(typeParamIsUsedOrDeclared())
.should().onlyDependOn(classes().that(typeParamIsUsedOrDeclared()));
private DescribedPredicate super JavaClass> typeParamIsUsedOrDeclared() {
return new DescribedPredicate("use or declare type variable") {
@Override
public boolean apply(JavaClass input) {
return input.getGenericSuperclass() != null ||
input.getInterfaces().stream().anyMatch(i -> i.getErasure().equals(input));
}
};
}
其中,typeParamIsUsedOrDeclared()方法返回了自定义类型谓词,该谓词选择那些定义了泛型类型参数的类型。在规则定义中,我们将这个谓词应用到了源头和目标类上,确保它们都没有被使用或依赖了其他类的泛型类型参数。