ArchUnit 规则阻止访问派生 类?

ArchUnit Rule to prevent access to derived classes?

一位同事进行了一些重构,并将一个方法移至 superclass,以便能够从另一个子 class 重用它。 IDE 处理得很快,没有任何抱怨。 然而,该方法在内部引用了一个常量,该常量 not 随该方法移动,即父 class 因此现在在其子 [=] 之一中引用常量19=]es 这当然是不行的!

我如何表述 ArchUnit 规则以防止父级对 members/methods/local classes 和 enums/etc 进行此类引用。在 child-classes 中(或者一般来说:classes 中的任何东西在层次结构的下方)?

对于直接依赖,可以使用下面的自定义ArchCondition

@ArchTest
ArchRule rule = noClasses().should(new ArchCondition<JavaClass>("depend on their children") {
    @Override
    public void check(JavaClass parentClass, ConditionEvents events) {
        parentClass.getDirectDependenciesFromSelf().stream()
            .filter(dependency -> dependency.getTargetClass() != parentClass
                    && dependency.getTargetClass().isAssignableTo(parentClass.getName()))
            .forEach(dependency -> events.add(satisfied(dependency, dependency.getDescription())));
    }
});

它可以很容易地适应也捕获传递依赖,例如在这个例子中:

class Parent { 
    Friend friend; 
}
class Friend { 
    Child child; 
}
class Child extends Parent { 
}

基本可以替换getDirectDependenciesFromSelf with getTransitiveDependenciesFromSelf:

@ArchTest
ArchRule rule = noClasses().should(new ArchCondition<JavaClass>("depend on their children") {
    @Override
    public void check(JavaClass parentClass, ConditionEvents events) {
        parentClass.getTransitiveDependenciesFromSelf().stream()
            .filter(dependency -> dependency.getTargetClass() != parentClass
                    && dependency.getTargetClass().isAssignableTo(parentClass.getName()))
            .forEach(dependency -> events.add(satisfied(dependency, parentClass.getName()
                    + " (transitively) depends on its child: " + dependency.getDescription())));
    }
});

仅供参考:我正在使用以下静态导入:

import static com.tngtech.archunit.lang.SimpleConditionEvent.satisfied;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;