[英]Should a default implementation of an interface with stub methods be abstract?
假设我有一个界面
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类声明为抽象类吗? 还是应该具有受保护的默认构造函数(例如,对StubbedMyInterface进行的单元测试(该方法可以检查所有方法均抛出所需的异常)可以实例化该类而不创建不必要的子类)? 还是应该只是普通的公开课?
更新:好的,我看到我应该提供更多的上下文。 实现抽象语法树的访客模式时,会发生此问题。 接口在树中为每种节点类型定义一种方法,并且这些方法有很多类型。
我有几个这样的Stub实现:
对我来说,这取决于布赫。 “一堂课应该简单而完整。” 这堂课完了吗? 如果不是,则应该是抽象的。
该结构的性质并不引人注目。 此类本身是否对某些事情有用是关键因素。 如果不是,则应该是抽象的。
如果某些接口方法定义不应该实现,那么我宁愿将它们分布在多个接口上。
然后,我将仅实现确切的接口,其中包含我感兴趣的方法定义。
例如:
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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.