我有几个类,其中有我想要强制执行的公共(public) setter 方法。
我可以使用抽象
类显式定义 setter,然后扩展该类,或者我可以实现一个接口(interface)
。但是如果使用interface
,我将不得不一遍又一遍地编写 setter 方法,这似乎违反了 DRY 原则。
public abstract class AbstractParent {
int value;
protected void setValue(int value) {
this.value = value;
}
}
对比
public interface MyInterface {
void setValue(int value);
}
什么时候使用哪种方法有意义?
最佳答案
最抽象(“最好”)的方法是两者一起使用:
// The contract
public interface MyInterface {
void setValue(int value);
}
// A convenient implementation from which to base a concrete implementation
public abstract class AbstractParent implements MyInterface {
int value;
void setValue(int value) {
this.value = value;
}
}
您可以在整个 JDK 中看到这种模式的实际应用,例如:
interface Map {...
abstract class AbstractMap implements Map {...
class HashMap extends AbstractMap {...
此模式允许编码人员提供他们自己的遵守契约的类,这在单元测试使用这些对象的代码时尤为重要,因为模拟接口(interface)比模拟类容易得多,它可能是最终的,具有私有(private)构造函数或其他不方便的功能。
关于java - 像setter这样简单的东西,用接口(interface)好还是抽象类好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40116936/