Будут ли циклические зависимости модулей возможны в Java 9?


В Java 9 будут ли разрешены циклические модули? Если нет, то каковы причины?

module com.foo.bar {
    requires com.foo.baz;
    exports com.foo.bar.fizz;
}

module com.foo.baz {
    requires com.foo.bar;
    exports com.foo.baz.buzz;
}
2 13

2 ответа:

Нет.

Документация

Интересно, что нисостояние системы модулей , ниJigsaw Quick Start Guide не затрагивают эту проблему. Один источник (найденный Энди ) - это Яваонский разговор Алекса Бакли (см. Его объяснение Здесь). Более поздним является список открытых проблем , в котором явно упоминаются циклические зависимости :

Текущий проект запрещает циклы, когда граф модуля изначально разрешается во время компиляции, во время компоновки и во время выполнения. Циклы могут возникнуть позже во время выполнения, если ребра читаемости добавлены для автоматических модулей или через отражение. [...] Однако это ограничение не является документированным требованием [...].

Оправдание

Циклические зависимости плохи, мкай. ;)

Они возникают, когда две сущности (методы, классы, модули, проекты, ...) сотрудничают, но недостаточно разобщены. Для пользователей, а также сопровождающих это соединение означает что они не могут использовать или улучшать одно, не рассматривая другое. Но это именно то преимущество, которого пытается достичь модульность.

Из списка проблем, приведенного выше:

Причина отказа от циклов во время разрешения заключается в том, что это облегчает анализ графа модулей, упрощает саму систему модулей и что с философской точки зрения любые модули, участвующие в цикле, в любом случае логически являются одним модулем, поэтому они должны быть определены как таковые в первом случае. место.

Экспериментирование

Я создал небольшой демонстрационный проект на GitHub, который содержит два цикла ( пара: два -> один -> два; тройка: три -> два -> один -> три). Попытка многомодульной компиляции , как показано в руководстве по быстрому запуску, приводит к следующим результатам:

./compile.sh
 > creating clean directories
 > compiling and packaging cycle "pair"
src/org.codefx.demo.cyclic.pair.one/module-info.java:2: error: cyclic dependence involving org.codefx.demo.cyclic.pair.two
        requires org.codefx.demo.cyclic.pair.two;
                                            ^
1 error
 > compiling and packaging cycle "triple"
src/org.codefx.demo.cyclic.triple.three/module-info.java:2: error: cyclic dependence involving org.codefx.demo.cyclic.triple.two
        requires org.codefx.demo.cyclic.triple.two;
                                              ^
1 error
Таким образом, вы даже не можете скомпилировать модули, не говоря уже о том, чтобы использовать их в конфигурации.

За исключением того, что модули являются автоматическими модулями , Проблема не возникнет. допускаются только транзитивные зависимости , а транзитивные зависимости никогда не бывают цикличными.