避免代码重复Java的良好实践

我有一个规范接口,可以将其称为 Spec ,而有两个实现它的类可以将它们称为 ImpA ImpB 。效果很好,直到我意识到 ImpA impB 的方法很少共享相同的实现。 我尝试通过在默认情况下在 Spec 中声明方法并在其中正确实现这些方法来避免这种情况,但是我敢肯定,有更好的方法可以做到这一点。 也许有一些设计模式?

softAnka 回答:避免代码重复Java的良好实践

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

对于需要访问类实例变量的更复杂的情况,可以使用通用代码创建另一个抽象类。然后ImpAImpB将扩展抽象类。

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

,

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

就个人而言,我发现更喜欢委派而不是组成的代码更优雅,更可测试并且更“可重构”。但是,就像许多其他设计问题一样,对此有很多不同而有效的意见。

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();
    }
}
,

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

本文链接:https://www.f2er.com/3163445.html

大家都在问