operator - ¿Serán posibles las dependencias del módulo cíclico en Java 9?
java modules (2)
Excepto que los módulos son módulos automáticos , el problema no surgirá. Solo se permiten las dependencias transitivas y las dependencias transitivas nunca son cíclicas.
En Java 9, ¿se permitirán módulos cíclicos? Si no, ¿cuáles son las razones?
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;
}
Nop.
Documentación
Curiosamente, ni el Estado del sistema de módulos ni la Guía de inicio rápido de Jigsaw abordan este problema. Una fuente (encontrada por Andy ) es una charla de JavaOne por Alex Buckley (verlo explicarla aquí ). Una más reciente es la lista de problemas abiertos , que menciona explícitamente dependencias cíclicas :
El borrador actual no permite ciclos cuando el gráfico del módulo se resuelve inicialmente en tiempo de compilación, tiempo de enlace y tiempo de ejecución. Los ciclos pueden surgir más adelante en el tiempo de ejecución si se agregan bordes de legibilidad para los módulos automáticos, o por reflexión. [...] Esta restricción no es, sin embargo, un requisito documentado [...].
Justificación
Las dependencias cíclicas son malas, mkay. ;)
Surgen cuando dos entidades (métodos, clases, módulos, proyectos, ...) colaboran pero no están lo suficientemente desacopladas. Tanto para los usuarios como para los mantenedores, este acoplamiento significa que no pueden usar ni mejorar uno sin considerar el otro. Pero esta es exactamente la ventaja que la modularización está tratando de lograr.
De la lista de problemas, enlazada arriba:
La razón para rechazar ciclos durante la resolución es que hace que el gráfico del módulo sea más fácil de razonar, simplifica el sistema del módulo y, filosóficamente, cualquier módulo involucrado en un ciclo es lógicamente un módulo de todos modos, por lo que deberían definirse como tales en primer lugar.
Experimentación
He creado un pequeño proyecto de demostración en GitHub que contiene dos ciclos ( par : dos -> uno -> dos, triple : tres -> dos -> uno -> tres). Al intentar la compilación de varios módulos como se muestra en la guía de inicio rápido, estos son los resultados:
./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
Así que ni siquiera puedes compilar los módulos, y mucho menos usarlos en una configuración.