如果使用存根方法的接口默认实现是抽象的



假设我有一个接口

interface MyInterface {
  void doSomething();
  void doSomethingElse();
  /* way more methods */
}

也许是这样的默认实现:

class StubbedMyInterface implements MyInterace {
  void doSomething() {
    throw new UnsupportedOperationException();
  }
  void doSomethingElse() {
    throw new UnsupportedOperationException();
  }
  /* all the other methods */
}

简短的类仅存在,因此接口的实施者不需要实现他们不在乎的所有方法。

是否应该声明类固定的Interface类抽象?还是应该具有受保护的默认构造函数(例如,用于检查所有方法是否会抛出所需异常的单位测试可以实例化,而无需创建不必要的子类)?还是班级应该是普通的公共课?

更新:好的,我看到我应该提供更多上下文。在为抽象语法树实施访问者模式时发生了这个问题。该界面定义了树中的每个节点类型的一种方法,这些方法是很多类型。

我有几个存根实现:

  1. 就像上面有用的一个一样,例如在处理某个节点的孩子时 - 在这种情况下,我知道只有a,b和c的节点可能是我处理孩子的孩子的孩子。如果我弄错了这个问题,我想让一些错误消息将我指向问题。
  2. 一个仅对每种方法具有空的实现的一个 - 如果我只想处理节点,我知道该怎么做并忽略其他方法。
  3. 默认情况下遍历每个节点的孩子的一个,如果我想穿越一棵树,但只关心某些节点类型,这很有用。

对我来说,这归结于booch。"班级应该是简约和完整的。"这堂课完成了吗?如果没有,它应该是抽象的。

结构的性质并不令人信服。这类本身是否对某事很有用是关键因素。如果不是,它应该是抽象的。

如果不应该实现某些接口方法定义,那么我更喜欢将它们散布给它们累积几个接口。

然后,我将仅实现 extcriact 接口,该接口保持我感兴趣的方法定义。

例如:

interface MyFirstInterface {
    void doSomething();
}
interface MySecondInterface {
    void doSomethingElse();
}
public class MyClass implement MySecondInterface {
    void doSomethingElse() {
    }
}

使用Java 8,您可以在接口本身中定义默认实现,该实现比抽象类(您可以继承多个接口)更具灵活性 - 因此看起来像:

interface MyInterface {
  default void doSomething() {
    throw new UnsupportedOperationException();
  }
  default void doSomethingElse() {
    throw new UnsupportedOperationException();
  }
  /* all the other methods */
}

使用Java 7及更早的使用抽象类将有意义提供默认的基本实现。

如果接口的实现者不需要实现所有方法,则他们不需要实现此接口,则只需使用所需的方法集,它们在层次结构中只需要一个接口即可。我会使用这样的继承

interface MyFirstInterface {
    void doSomething();
}
interface MySecondInterface extends MyFirstInterface {
    void doSomethingElse();
}

最新更新