如何正确使用模块化的Java接口?

如何正确使用模块化的Java接口?,java,inheritance,interface,module,Java,Inheritance,Interface,Module,我正在尝试模块化遗留代码,在这样做的过程中,我遇到了以下问题: 我有两个属于同一个模块的类-以及许多其他类-每个类都有一个或多个用于其他地方的公共方法。我想为模块创建一个通用接口,但我不确定如何进行。如果我为模块创建一个接口,我将不得不在使用该接口的所有类中实现空白方法,这听起来不是很好。但是,如果我创建了多个接口,这些接口可以由模块中的特定类使用,那么我就只能将它们组合在一个接口中,而这个接口仅用于类型引用: /-------------\ /-------------\ | Inte

我正在尝试模块化遗留代码,在这样做的过程中,我遇到了以下问题:

我有两个属于同一个模块的类-以及许多其他类-每个类都有一个或多个用于其他地方的公共方法。我想为模块创建一个通用接口,但我不确定如何进行。如果我为模块创建一个接口,我将不得不在使用该接口的所有类中实现空白方法,这听起来不是很好。但是,如果我创建了多个接口,这些接口可以由模块中的特定类使用,那么我就只能将它们组合在一个接口中,而这个接口仅用于类型引用:

/-------------\     /-------------\
| Interface A |     | Interface B |
\-------------/     \-------------/
/-------------\     /-------------\
|   Class A   |     |   Class B   |
\-------------/     \-------------/

/-------------\     /-------------\
| Interface A |     | Interface B |
\-------------/     \-------------/
            ^         ^
            |         |
        /------------------\
        | Module Interface |
        \------------------/

是否有任何设计模式可以帮助我实现这一点,或者将构成特定模块的接口组合到子接口中,以正确的方式表示模块类型以实现这一点?

如果您创建一个公共接口,该接口的用户将期望其所有方法都能正常工作(除非文件中明确说明如何使用)

如果您最终不得不在接口级别指定复杂的规则来使用它,以便两个模块都能很好地工作,那么创建自定义接口并不是最好的主意

但是,如果两个模块中只有几个不同于另一个模块的方法,并且在调用时这些差异不会破坏模块,那么您可以创建一个自定义接口,然后提供每个模块接口的默认抽象实现,实际模块从该接口派生。抽象实现可以定义一个默认的抽象实现(例如,不执行任何操作)实现公共接口中的所有方法,因此具体的模块类不必专门实现它们

interface AIface {
  void methodA();
}

interface BIface {
  void methodB();
}

interface CommonIface extends AIface, BIface {
}

abstract class CommonAbstract implements CommonIface {
  @Override
  void methodA() {}
  @Override
  void methodB() {}
}

class ModuleA extends CommonAbstract {
  @Override
  void methodA() {
    // A's implementation
  }
}

class ModuleB extends CommonAbstract {
  @Override
  void methodB() {
    // B's implementation
  }
}

如果创建公共接口,该接口的用户将期望其所有方法都能工作(除非文档中明确说明如何使用)

如果您最终不得不在接口级别指定复杂的规则来使用它,以便两个模块都能很好地工作,那么创建自定义接口并不是最好的主意

但是,如果两个模块中只有几个不同于另一个模块的方法,并且在调用时这些差异不会破坏模块,那么您可以创建一个自定义接口,然后提供每个模块接口的默认抽象实现,实际模块从该接口派生。抽象实现可以定义一个默认的抽象实现(例如,不执行任何操作)实现公共接口中的所有方法,因此具体的模块类不必专门实现它们

interface AIface {
  void methodA();
}

interface BIface {
  void methodB();
}

interface CommonIface extends AIface, BIface {
}

abstract class CommonAbstract implements CommonIface {
  @Override
  void methodA() {}
  @Override
  void methodB() {}
}

class ModuleA extends CommonAbstract {
  @Override
  void methodA() {
    // A's implementation
  }
}

class ModuleB extends CommonAbstract {
  @Override
  void methodB() {
    // B's implementation
  }
}

我不确定我是否真的理解您的问题,但您可以通过继承将接口组合成一个接口。也就是说,接口支持多重继承

可能适用于您的模式是适配器模式:


也尝试不要为了制作它们而制造接口。java有着长期的历史,试图为那些永远不会有其他实现的东西制作接口。除非你制作一个API考虑了吻。hat接口支持多重继承

可能适用于您的模式是适配器模式:


也尝试不要为制作它们而制造接口。java有着长期的历史,试图为那些永远不会有其他实现的东西制作接口。除非你制作一个API考虑了KISH。< /P>管他的模块是什么?你是说包,Maven子项目……?我是指模块的编程概念,这不是Java特有的东西。一般的想法是创建模块并对其进行接口,这样当我们想要更改模块的工作方式时,也就是说,为了提高效率,我们会替换接口下的代码,而接口之外的所有东西都会在不知道更改的情况下继续工作。模块到底是什么?你说的是pack吗年龄,maven子项目…?我指的是模块的编程概念,它不是Java特有的东西。一般的想法是创建模块并对其进行接口,这样当我们想要改变模块的工作方式时,也就是说,为了提高效率,我们会替换接口下的代码,而接口之外的一切都会在不知情的情况下工作改变的结果。