java - 像setter这样简单的东西,用接口(interface)好还是抽象类好?

标签 java interface abstract-class setter

我有几个类,其中有我想要强制执行的公共(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/

相关文章:

java - 需要帮助查找分解代码中的错误

java - 在类中传递通用对象类型

java - Swing - 显示空白屏幕的 Java 程序

java - NumberFormatException:无法将 '' 解析为整数

java - 通过耳机路由 MIC 输入,通过手机扬声器路由音频输出

vb.net - 为什么从接口(interface)值设置对象仅在一行 if 语句上抛出 invalidCastException

java - OO 设计问题接口(interface)和类

interface - 使用 CaSTLe Windsor 3.0 拦截 Startable 设施调用的方法

C# 存储库设计问题

LINQ 中常见列的 C# 抽象基类