Подтвердить что ты не робот

Возможны ли циклические модули в 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;
}
4b9b3361

Ответ 1

Неа.

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

Интересно, что ни Состояние модульной системы, ни 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

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

Ответ 2

Кроме модулей автоматических модулей, проблема не возникает. Разрешены только транзитивные зависимости, а транзитивные зависимости никогда не являются циклическими.