Как правильно организовать интерфейсы и реализации в модульном проекте Java? - PullRequest
0 голосов
/ 10 апреля 2020

Я ищу способ правильно организовать интерфейсы и реализации в модульном проекте 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 мои намерения относительно модуля Классы видимости внутри и снаружи модуля оба. Вероятно, есть лучшие практики для этой ситуации.

...