下面的Java代码真的包含循环依赖吗?

Sha*_*mad 2 java

'

在我们团队最近的一次讨论中,我编写了以下代码,该代码后来被标记为具有循环依赖关系,尽管根据我的知识和经验,事实并非如此。我需要一些新的眼光来审视它,这样我才能了解更多。

免责声明:生产代码已转换为相应的虚拟代码以避免版权问题。主方法(当然)在产品代码中不存在。

Beany.java

public class Beany {

    private String x;

    public static void main(String[] args) {
        // main exists for testing purposes here. Depicts the functionality of validation function.
        List<BeanyValidator> validatorList = List.of(isConfigDataNull(),
                                                     isValueOfXEmpty());
        Beany beany = new Beany();
        beany.setX("");
        System.out.println(collectErrorsFrom(beany, validatorList));
    }

    public void setX(String x) { // setters in our code does not exist. This is merely for demo purposes here.
        this.x = x;
    }

    public String getX() {
        return x;
    }
}
Run Code Online (Sandbox Code Playgroud)

BeanyValidator.java

public interface BeanyValidator extends Function<Beany, String> {

    static BeanyValidator isConfigDataNull() {
        return beany -> Objects.isNull(beany)
                               ? "Object is null!"
                               : "NO_ERROR";
    }

    static BeanyValidator isValueOfXEmpty() {
        return beany -> beany.getX().isEmpty()
                               ? "Value is empty!"
                               : "NO_ERROR";
    }

    static List<String> collectErrorsFrom(Beany beany, List<BeanyValidator> validators) {
        return validators.stream()
                         .map(validator -> validator.apply(beany))
                         .filter(err -> !"NO_ERROR".equals(err))
                         .collect(Collectors.toList());
    }
}
Run Code Online (Sandbox Code Playgroud)

循环依赖被指出的事实是,Beany它被用作Function<T,U>——使 Beany 依赖于 BeanyValidator——并在 main 方法中使用验证器(在 prod 中是某种验证函数)使验证器成为 Beany 的依赖项,从而造成循环依赖。我不同意我尊敬的同行的观点,但我总是在讨论时认为我可能是错的。

顺便说一句,我使用 Java8 函数应用了组合器模式。有人可以解释一下吗?

提前致谢!

亲切的问候。

mat*_*sev 5

是的,存在循环依赖:

  • Beany有一个List<BeanyValidator>
  • 接口BeanyValidator扩展Function<Beany, String>

这可以通过将类放在不同的包中然后查看代码编译所需的导入语句来验证。您会发现一个类导入另一个类,反之亦然。

打破循环依赖的一个建议是将main()方法从Beany类重构为单独的类,例如

public class Main {
    public static void main(String[] args) {
        List<BeanyValidator> validatorList = List.of(isConfigDataNull(),
                                                     isValueOfXEmpty());
        Beany beany = new Beany();
        beany.setX("");
        System.out.println(collectErrorsFrom(beany, validatorList));
    }
}
Run Code Online (Sandbox Code Playgroud)