假设我有一个界面
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实现:
答案 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();
}