Я ищу способ правильно организовать интерфейсы и реализации в модульном проекте Java 11.
Рассматривая простейший случай: существует интерфейс и несколько его реализаций. Намерение состоит в том, чтобы представить только этот интерфейс и его фабричные методы в качестве API модуля.
MyInterface. java
public interface MyInterface {
String action(String input);
//--- factory methods
static MyInterface createSimple(Object argument){
return new MySimpleImpl(argument);
}
static MyInterface createComplex(Object a, Object b){
return new MyComplexImpl(a,b);
}
}
MySimpleImpl. java
class MySimpleImpl implements MyInterface { ... }
MyComplexImpl. java
class MyComplexImpl implements MyInterface { ... }
Предположим, что пакет root равен org.company.myproject
.
Итак, module-info.java
содержит только один экспорт: exports org.company.myproject;
Я вижу несколько способов организации кода, например очевидные:
Версия 1: Поместить реализации во вложенные упакуйте и сделайте их public
.
Версия 2: Поместите реализации в пакет root и сохраните их package-private
.
В настоящее время я не могу предпочесть ни одну из версий, потому что первая заставляет меня нарушать контракты о видимости внутри самого модуля, а вторая загрязняет пакет root, делая его намерения неопределенными.
Пожалуйста, помогите мне понять, как точно express мои намерения относительно модуля Классы видимости внутри и снаружи модуля оба. Вероятно, есть лучшие практики для этой ситуации.