Я можу сказати вам лише свою думку організації з цього приводу. Ми знаходимося в процесі переходу до модулів, для кожного окремого проекту, ми працюємо. Те, що ми будуємо, - це в основному мікросервіси + деякі бібліотеки клієнтів. Для мікросервісів перехід на modulesдещо нижчий пріоритет: код там уже якимось чином ізольований у контейнері докера, тому "додавання" модулів туди не здається (нам) дуже важливим. Ця робота починається повільно, але вона є пріоритетною.
З іншого боку, клієнтські бібліотеки - це зовсім інша історія. Я не можу сказати вам, який у нас інколи безлад. Поясню один момент, який я раніше ненавидів jigsaw. Ви надаєте клієнтам інтерфейс для всіх. Автоматично interfaceце public- піддається світові. Зазвичай те, що я роблю, - це мати деякі package-privateкласи, які не піддаються дії клієнтів, які використовують цей інтерфейс. Я не хочу, щоб клієнти цим користувались, це внутрішнє. Звучить добре? Неправильно.
Перша проблема полягає в тому, що коли ці package-privateкласи зростають, і ви хочете більше класів, єдиний спосіб тримати все прихованим - це створювати класи в одному пакеті:
package abc:
-- Usage.java
-- HelperUsage.java
-- FactoryUsage.java
....
Коли він росте (у наших випадках він зростає), ці пакети занадто великі. Перехід до окремого пакета, про який ви говорите? Звичайно, але тоді це HelperUsageі FactoryUsageбуде, publicі ми намагалися уникати цього з самого початку.
Проблема номер два: будь-який користувач / абонент наших клієнтів може створити одне і те ж ім’я пакета та розширити ці приховані класи. Це вже кілька разів траплялося з нами, веселі часи.
modulesвирішує цю проблему красиво: насправдіpublic це вже не так public ; Я можу отримати friendдоступ через exports toдирективу. Це значно полегшує життєвий цикл коду та управління ним. І ми втікаємо від пекла із навчальних стежок. Звичайно, впорайтеся maven/gradleз цим, головним чином, але коли є проблема, біль буде дуже реальною. Також може бути багато інших прикладів.
Тим не менш, перехід (все ще) непростий. Перш за все, усі в команді повинні бути вирівняні; по-друге, є перешкоди. Найбільші два, які я все ще бачу: це як ви розділяєте кожен модуль на основі чого? У мене поки немає однозначної відповіді. Другий - split-packagesо, прекрасний "той самий клас експортується за допомогою різних модулів". Якщо це трапляється з вашими бібліотеками, є способи пом'якшення; але якщо це зовнішні бібліотеки ... не що легко.
Якщо ви залежате від jarAі jarB(окремих модулів), але вони обидва експортують abc.def.Util, вас чекає сюрприз. Однак є способи вирішити це. Якось болісно, але розв’язано.
Загалом, з того часу, як ми перейшли на модулі (і досі це робимо), наш код став набагато чистішим. І якщо ваша компанія є компанією, яка першою розробляє код, це має значення. З іншого боку, я брав участь у компаніях, якщо старші архітектори вважали це «занадто дорогим», «ніякої реальної вигоди».