В 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;
}
В 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;
}
Неа.
Интересно, что ни Состояние модульной системы, ни Jigsaw Краткое руководство. Один из источников (найденный Andy) - это разговор JavaOne от Alex Buckley (см. Его объяснение здесь). Более поздним является список открытых проблем, в котором явно упоминается циклические зависимости:
Текущий проект запрещает циклы, когда граф модуля первоначально разрешен во время компиляции, времени соединения и времени выполнения. Циклы могут возникать позже во время выполнения, если для автоматических модулей добавляются четкости считывания или через отражение. [...] Это ограничение не является документированным требованием [...].
Циклические зависимости плохие, mkay.;)
Они появляются, когда два сущности (методы, классы, модули, проекты,...) сотрудничают, но недостаточно развязаны. Для пользователей, а также для сопровождающих, это соединение означает, что они не могут использовать или улучшать один, не учитывая другого. Но это именно то, к чему стремится модуляция.
Из списка проблем, связанного выше:
Обоснование запрета циклов во время разрешения состоит в том, что он упрощает рассуждение о модульном графе, он упрощает сама модульную систему и, что философски, любые модули, участвующие в цикле, логически являются одним модулем, так что они должны быть определяемые как таковые в первую очередь.
Я создал небольшой демонстрационный проект на 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
Поэтому вы даже не можете скомпилировать модули, не говоря уже о том, чтобы использовать их в конфигурации.
Кроме модулей автоматических модулей, проблема не возникает. Разрешены только транзитивные зависимости, а транзитивные зависимости никогда не являются циклическими.