具有存根方法的接口的默认实现是否应该是抽象的?

时间:2014-02-05 12:02:52

标签: java object

假设我有一个界面

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 */
}

存根类只是存在,因此接口的实现者不需要实现他们不关心的所有方法。

StubbedMyInterface类应该声明为abstract吗?或者它应该有一个受保护的默认构造函数(以便例如StubbedMyInterface的单元测试,它检查所有方法抛出所需的异常可以实例化该类而不创建一个不必要的子类)?或者该课程应该是一个普通的公共课?

更新: 好的,我知道我应该提供更多的背景信息。实现抽象语法树的访问者模式时发生此问题。接口在树中为每个节点类型定义一个方法,这些方法有很多类型。

我有几个这样的Stub实现:

  1. 一个像上面的那个是有用的,例如当处理某个节点的子节点时 - 在这种情况下,我知道只有节点类型A,B和C可能是我处理其子节点的节点的子节点。如果我弄错了,我想要一些错误信息指出我的问题。
  2. 每个方法只有一个空实现的方法 - 如果我只想处理我知道如何处理的节点并忽略其他节点,那么这很有用。
  3. 默认情况下遍历每个节点的子节点的一个节点,如果我想遍历完整的树但只关心某些节点类型,那么这个节点很有用。

4 个答案:

答案 0 :(得分:3)

对我来说,这归结为Booch。 “一堂课应该简约而完整。”这门课程完整吗?如果没有,它应该是抽象的。

结构的性质并不引人注目。这个类本身是否有用,是关键因素。如果没有,它应该是抽象的。

答案 1 :(得分:1)

如果不应该实现某些接口方法定义,那么我宁愿在几个接口上传播它们。

然后我只实现完全接口,该接口包含我感兴趣的方法定义。

例如:

interface MyFirstInterface {
    void doSomething();
}

interface MySecondInterface {
    void doSomethingElse();
}

public class MyClass implement MySecondInterface {
    void doSomethingElse() {

    }
}

答案 2 :(得分:1)

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

interface MyInterface {
  default void doSomething() {
    throw new UnsupportedOperationException();
  }

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

使用Java 7及更早版本,使用抽象类可以提供默认的基本实现。

答案 3 :(得分:0)

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

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