避免代码重复的良好做法 Java

Good practice to avoid code duplication Java

我有一个规范接口让我们称之为 Spec 和实现它的两个 类 让我们称之为 ImpAImpB。它工作得很好,直到我意识到 ImpAimpB 中很少有方法共享相同的实现。 我试图通过在 Spec 中声明默认方法并在其中正确实施它们来避免它,但我确信有更好的方法来做到这一点。 也许一些设计模式?

您可以将 Spec 设为超类,将 ImpA 和 ImpB 设为子类。您可以找到更多信息 on the JavaDoc

如果复制的代码不使用 class(实例变量)的状态,将代码放在接口的默认方法中是一种解决方案。

对于需要访问 class 实例变量的更复杂的情况,您可以使用公共代码创建一个额外的抽象 class。然后 ImpAImpB 将扩展摘要 class.

Java 中的集合使用了两者。例如,ArrayListLinkedList 扩展了 AbstractList,后者实现了 List,其中包含一些默认方法。

虽然您可以按照您的建议制作它们 default 方法,但另一种可能的解决方案是使用 Delegation 设计模式。这意味着有第四个 class 完全是为了分离公共逻辑。如果该逻辑需要值来操作,那么它们应该被注入到委托中以允许它独立操作(并被测试)。

就个人而言,我发现更喜欢委托而不是组合的代码更优雅、更可测试并且更多 'refactorable'。但是,像许多其他设计问题一样,对此有许多不同且有效的意见。

interface Spec { 
    void method();
}

class Imp1 implements Spec {
    private final Delegate delegate;

    public Imp1() {
        this.delegate = new Delegate(...);
    }

    public void method() {
        delegate.setContext(...);
        delegate.method();
    }
}