Будут ли циклические зависимости модулей возможны в 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 ответа:
Нет.
Документация
Интересно, что нисостояние системы модулей , ни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