假设我有一个接口
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类抽象?还是应该具有受保护的默认构造函数(例如,用于检查所有方法是否会抛出所需异常的单位测试可以实例化,而无需创建不必要的子类)?还是班级应该是普通的公共课?
更新:好的,我看到我应该提供更多上下文。在为抽象语法树实施访问者模式时发生了这个问题。该界面定义了树中的每个节点类型的一种方法,这些方法是很多类型。
我有几个存根实现:
- 就像上面有用的一个一样,例如在处理某个节点的孩子时 - 在这种情况下,我知道只有a,b和c的节点可能是我处理孩子的孩子的孩子。如果我弄错了这个问题,我想让一些错误消息将我指向问题。
- 一个仅对每种方法具有空的实现的一个 - 如果我只想处理节点,我知道该怎么做并忽略其他方法。
- 默认情况下遍历每个节点的孩子的一个,如果我想穿越一棵树,但只关心某些节点类型,这很有用。
对我来说,这归结于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();
}